ZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci8uY2xhc3NwYXRoIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxYzhmMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci8ucHJvamVjdCBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODgyZTJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFhN2VlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsNiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogRW1mYXRpYyBPbmxpbmUgRG9jdW1lbnRhdGlvbiAoSW5jdWJhdGlvbikKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAwLjMuMC5xdWFsaWZpZXIKK0J1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTM2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDcgQEAKK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCitiaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIGh0bWwvLFwKKyAgICAgICAgICAgICAgICoueG1sCmRpZmYgLS1naXQgYS9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvaHRtbC9hYm91dC5odG1sIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTNmNDVjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvYWJvdXQuaHRtbApAQCAtMCwwICsxLDMxIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbD4KKzxoZWFkPgorCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorCTxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0iYm9vay5jc3MiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KKwk8dGl0bGU+QWJvdXQgdGhpcyBDb250ZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+Cis8aDE+QWJvdXQgVGhpcyBDb250ZW50PC9oMT4KKzxoMz5Ob3RpY2VzPC9oMz4KKzxwPgorVGhlIG1hdGVyaWFsIGluIHRoaXMgZ3VpZGUgaXMgQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDA0LCAyMDA3LgorPC9wPgorCis8aDM+TGljZW5zZTwvaDM+Cis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCJDb250ZW50IikuICBVbmxlc3Mgb3RoZXJ3aXNlIAoraW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQorYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAorcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCitpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvaHRtbC9ib29rLmNzcyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2Jvb2suY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YzFjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvaHRtbC9ib29rLmNzcwpAQCAtMCwwICsxLDEwOCBAQAorUC5Db2RlIHsKKwlkaXNwbGF5OiBibG9jazsKKwl0ZXh0LWFsaWduOiBsZWZ0OworCXRleHQtaW5kZW50OiAwLjAwcHQ7CisJbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsKKwltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0OworCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKKwltYXJnaW4tbGVmdDogMTVwdDsKKwlmb250LXNpemU6IDEwLjAwMDAwMHB0OworCWZvbnQtd2VpZ2h0OiBtZWRpdW07CisJZm9udC1zdHlsZTogUmVndWxhcjsKKwljb2xvcjogIzQ0NDRDQzsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOworCXRleHQtdHJhbnNmb3JtOiBub25lOworCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciOworfQorSDYuQ2FwdGlvbkZpZ0NvbHVtbiB7CisJZGlzcGxheTogYmxvY2s7CisJdGV4dC1hbGlnbjogbGVmdDsKKwl0ZXh0LWluZGVudDogMC4wMDAwMDBwdDsKKwltYXJnaW4tdG9wOiAzLjAwMDAwMHB0OworCW1hcmdpbi1ib3R0b206IDExLjAwMDAwMHB0OworCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKKwltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsKKwlmb250LXNpemU6IDkuMDAwMDAwcHQ7CisJZm9udC13ZWlnaHQ6IG1lZGl1bTsKKwlmb250LXN0eWxlOiBJdGFsaWM7CisJY29sb3I6ICMwMDAwMDA7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKKwl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKKwlmb250LWZhbWlseTogIkFyaWFsIjsKK30KK1AuTm90ZSB7CisJZGlzcGxheTogYmxvY2s7CisJdGV4dC1hbGlnbjogbGVmdDsKKwl0ZXh0LWluZGVudDogMHB0OworCW1hcmdpbi10b3A6IDE5LjUwMDAwMHB0OworCW1hcmdpbi1ib3R0b206IDE5LjUwMDAwMHB0OworCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKKwltYXJnaW4tbGVmdDogMzBwdDsKKwlmb250LXNpemU6IDExLjAwMDAwMHB0OworCWZvbnQtd2VpZ2h0OiBtZWRpdW07CisJZm9udC1zdHlsZTogSXRhbGljOworCWNvbG9yOiAjMDAwMDAwOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CisJdGV4dC10cmFuc2Zvcm06IG5vbmU7CisJZm9udC1mYW1pbHk6ICJBcmlhbCI7Cit9CitFTS5VSUxhYmVsIHsKKwlmb250LXdlaWdodDogQm9sZDsKKwlmb250LXN0eWxlOiBSZWd1bGFyOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CisJdGV4dC10cmFuc2Zvcm06IG5vbmU7Cit9CitFTS5Db2RlTmFtZSB7CisJZm9udC13ZWlnaHQ6IEJvbGQ7CisJZm9udC1zdHlsZTogUmVndWxhcjsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOworCXRleHQtdHJhbnNmb3JtOiBub25lOworCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Cit9CisKK2ltZyB7CisJbWFyZ2luLWJvdHRvbTogMjAuMDAwMDAwcHQ7Cit9CisKKworLyogZm9sbG93aW5nIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgbmVlZCB0byBiZSByZW1vdmVkIGZvciBEQkNTICovCisKK2JvZHksIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHAsIHRhYmxlLCB0ZCwgY2FwdGlvbiwgdGgsIHVsLCBvbCwgZGwsIGxpLCBkZCwgZHQge2ZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjogIzAwMDAwMH0KK3ByZQkJCQl7IGZvbnQtZmFtaWx5OiBDb3VyaWVyLCBtb25vc3BhY2V9CisKKy8qIGVuZCBmb250IGZhY2UgZGVjbGFyYXRpb25zICovCisKKy8qIGZvbGxvd2luZyBmb250IHNpemUgZGVjbGFyYXRpb25zIHNob3VsZCBiZSBPSyBmb3IgREJDUyAqLworYm9keSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgcCwgdGFibGUsIHRkLCBjYXB0aW9uLCB0aCwgdWwsIG9sLCBkbCwgbGksIGRkLCBkdCB7Zm9udC1zaXplOiAxMHB0OyB9CitwcmUJCQkJeyBmb250LXNpemU6IDEwcHR9CisKKy8qIGVuZCBmb250IHNpemUgZGVjbGFyYXRpb25zICovCisKK2JvZHkJICAgICB7IGJhY2tncm91bmQ6ICNGRkZGRkZ9CitoMSAgICAgICAgICAgeyBmb250LXNpemU6IDE4cHQ7IG1hcmdpbi10b3A6IDU7IG1hcmdpbi1ib3R0b206IDEgfQkKK2gyICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTRwdDsgbWFyZ2luLXRvcDogMjU7IG1hcmdpbi1ib3R0b206IDMgfQoraDMgICAgICAgICAgIHsgZm9udC1zaXplOiAxMXB0OyBtYXJnaW4tdG9wOiAyMDsgbWFyZ2luLWJvdHRvbTogMyB9CitoNCAgICAgICAgICAgeyBmb250LXNpemU6IDEwcHQ7IG1hcmdpbi10b3A6IDIwOyBtYXJnaW4tYm90dG9tOiAzOyBmb250LXN0eWxlOiBpdGFsaWMgfQorcCAgICAgICAgICAgIHsgbWFyZ2luLXRvcDogMTBweDsgbWFyZ2luLWJvdHRvbTogMTBweCB9CitwcmUJICAgICB7IG1hcmdpbi1sZWZ0OiA2OyBmb250LXNpemU6IDlwdCB9CithOmxpbmsJICAgICB7IGNvbG9yOiAjMDAwMEZGIH0KK2E6aG92ZXIJICAgICB7IGNvbG9yOiAjMDAwMDgwIH0KK2E6dmlzaXRlZCAgICB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIH0KK3VsCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxMCB9CitsaQkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9IAorbGkgcAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9IAorb2wJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDEwIH0KK2RsCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxMCB9CitkdAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMDsgZm9udC13ZWlnaHQ6IGJvbGQgfQorZGQJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfQorc3Ryb25nCSAgICAgeyBmb250LXdlaWdodDogYm9sZH0KK2VtCSAgICAgeyBmb250LXN0eWxlOiBpdGFsaWN9Cit2YXIJICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpY30KK2Rpdi5yZXZpc2lvbiB7IGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDsgYm9yZGVyLWxlZnQtd2lkdGg6IHRoaW47IAorCQkJCSAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjN0I2OEVFOyBwYWRkaW5nLWxlZnQ6NSB9Cit0aAkgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQpkaWZmIC0tZ2l0IGEvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvRnV0dXJlV29yay5odG0gYi9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvaHRtbC9nZXR0aW5nc3RhcnRlZC9GdXR1cmVXb3JrLmh0bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzFjMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvRnV0dXJlV29yay5odG0KQEAgLTAsMCArMSwzNyBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bGluayByZWw9IlNUWUxFU0hFRVQiIGhyZWY9Ii4uL2Jvb2suY3NzIiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8dGl0bGU+SWRlYXMgZm9yIGZ1dHVyZSB3b3JrPC90aXRsZT4KKworPC9oZWFkPgorCis8Ym9keSBsYW5nPUVOLVVTPgorCis8aDI+SWRlYXMgZm9yIGZ1dHVyZSB3b3JrPC9oMj4KKworPHA+TWFueSBleHRlbnNpb25zIGFyZSBwb3NzaWJsZS4gPC9wPgorCis8cD5UaGUgRW1mYXRpYyB0ZXh0IGVkaXRvciBjb3VsZCBiZSBleHRlbmRlZCB3aXRoIHVzYWJpbGl0eSBmZWF0dXJlcyBvZiB0aGUga2luZCBkZXNjcmliZWQgaW4gdGhlIHRlY2huaWNhbCByZXBvcnQgCis8YSBocmVmPSJodHRwOi8vd3d3LnN0cy50dS1oYXJidXJnLmRlL35taS5nYXJjaWEvU29DMjAwNy9kcmFmdHJlcG9ydC5wZGYiPjxpPkdlbmVyYXRpb24gb2YgRWNsaXBzZS1iYXNlZCBJREVzIGZvciBDdXN0b20gRFNMczwvaT48L2E+LiA8L3A+CisKKzxwPkFzIGFub3RoZXIgZXhhbXBsZSwgaGludHMgZm9yIGRpYWdyYW0gbGF5b3V0IGNvdWxkIGJlIHNwZWNpZmllZCBhbG9uZyB0ZXh0LCB3aXRoIGFuIGFjY29tcGFueWluZyB2aXN1YWxpemF0aW9uIChhcyBhIHNlY29uZCB0YWJiZWQKK3BhZ2UgaW4gPHR0Pk11bHRpUGFnZUVkaXRvcjwvdHQ+KSwgZm9sbG93aW5nIHRoZSBpZGVhcyBvZiA8L3A+CisKKzx1bD4KKworPGxpPkRpb21pZGlzIFNwaW5lbGxpcy4gT24gdGhlIGRlY2xhcmF0aXZlIHNwZWNpZmljYXRpb24gb2YgbW9kZWxzLiBJRUVFIFNvZnR3YXJlLCAyMCgyKTo5NJY5NiwgTWFyY2gvQXByaWwgMjAwMzwvbGk+Cis8YSBocmVmPSJodHRwOi8vd3d3LnNwaW5lbGxpcy5nci9wdWJzL2pybmwvMjAwMy1JRUVFU1ctdW1sZ3JhcGgvaHRtbC9hcnRpY2xlLmh0bWwiPmh0dHA6Ly93d3cuc3BpbmVsbGlzLmdyL3B1YnMvanJubC8yMDAzLUlFRUVTVy11bWxncmFwaC9odG1sL2FydGljbGUuaHRtbDwvYT4KKzxicj4KK0EgdG9vbCBleGVtcGxpZnlpbmcgdGhlIHByb3Bvc2VkIGZ1bmN0aW9uYWxpdHkgaXMgVU1MR3JhcGg6IDxhIGhyZWY9Imh0dHA6Ly93d3cuc3BpbmVsbGlzLmdyL3N3L3VtbGdyYXBoLyI+aHR0cDovL3d3dy5zcGluZWxsaXMuZ3Ivc3cvdW1sZ3JhcGgvPC9hPgorPGxpPiBNYXJ0aW4gRm93bGVyIG9uIHRoaXMgdG9waWMsIKA8YSBocmVmPSJodHRwOi8vbWFydGluZm93bGVyLmNvbS9ibGlraS9VbWxTa2V0Y2hpbmdUb29scy5odG1sIj5odHRwOi8vbWFydGluZm93bGVyLmNvbS9ibGlraS9VbWxTa2V0Y2hpbmdUb29scy5odG1sPC9hPgorPC9saT4gCisKKzxsaT4gQW5vdGhlciwgbGF5b3V0IG9ubHkgdG9vbCwgd2l0aCBzeW50YXggZm9yIGxheW91dCBoaW50czogTWV0YVVNTCA8YSBocmVmPSJodHRwOi8vbWV0YXVtbC5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vbWV0YXVtbC5zb3VyY2Vmb3JnZS5uZXQvPC9hPjwvbGk+IAorCis8L3VsPgorCis8L2JvZHk+CisKKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDEuZ2lmIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwMS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JmOTgzNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDIuZ2lmIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwMi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NmMjkwYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDMuZ2lmIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwMy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2YTY2MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDQuZ2lmIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwNC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwNmYzMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDUuanBnIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwNS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2YjAyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDYuZ2lmIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwNi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlZDYyZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDcuZ2lmIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwNy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzOWQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDguZ2lmIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwOC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4MzMyMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDkuanBnIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwOS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlY2FiMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDkuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTAuZ2lmIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAxMC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljZGQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTAuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTEuZ2lmIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAxMS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4YjYxOQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTIuanBnIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAxMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk0YjNjZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTMuZ2lmIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAxMy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViMzVjYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTQuZ2lmIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAxNC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjMTFiNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTUuanBnIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAxNS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5Y2VlMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTYuZ2lmIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAxNi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1ZDRhMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLmh0bSBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLmh0bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjdhZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvZ2V0dGluZ3N0YXJ0ZWQvR1VJRmVhdHVyZXMuaHRtCkBAIC0wLDAgKzEsMjg2IEBACis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0iLi4vYm9vay5jc3MiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KKzx0aXRsZT5Vc2FiaWxpdHkgZmVhdHVyZXMgb2YgdGhlIGVkaXRvciA8L3RpdGxlPgorCisKKzwvaGVhZD4KKworPGJvZHkgbGFuZz1FTi1VUz4KKworPGgxPlVzYWJpbGl0eSBmZWF0dXJlcyBvZiB0aGUgZWRpdG9yPC9oMT4KKworCis8aDI+QXJjaGl0ZWN0dXJlPC9oMj4KKworPHA+VGhlIG1haW4gbW90aXZhdGlvbiBiZWhpbmQgdGhlIEdVSSBpbXByb3ZlbWVudHMgd2FzIGFkZGluZworc3VwcG9ydCBmb3IgRU1GIEdlbmVyaWNzIHRvIHRoZSBGZWIgMjAwNSByZWxlYXNlIG9mIEVtZmF0aWMgKGF1dGhvcmVkIGJ5IENocmlzdG9waGVyIEogRGFseSkuCis8YnI+CitUaGUgY29udmVyc2lvbiBiZXR3ZWVuIDx0dD4uZWNvcmU8L3R0PiBhbmQgPHR0Pi5lbWY8L3R0PiBub3cgdW5kZXJzdGFuZHMgdGhlbSwgYXMgYSBjb25zZXF1ZW5jZSBFbWZhdGljCitub3cgcmVxdWlyZXMgRU1GIDIuMyBvciBoaWdoZXIuIEV4YW1wbGVzIG9mIG5ldyBwcm9kdWN0aW9ucyBpbiB0aGUgZ3JhbW1hciBhcHBlYXIKK2F0IHRoZSBlbmQgb2YgdGhpcyBkb2N1bWVudCwgdGhlIG5ldyBncmFtbWFyIGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlLiA8L3A+CisKKzxwPkFmdGVyIGVhY2gga2V5c3Ryb2tlIHRoZSBkb2N1bWVudCBpcyBwYXJzZWQsIGEgQ1NUIGlzIGJ1aWx0IGFuZAorKGlmIHBvc3NpYmxlKSBhbiBBU1QgdG9vLiBBIGJpZGlyZWN0aW9uYWwgbXVsdGltYXAga2VlcHMgdGhlIGNvcnJlc3BvbmRlbmNlCitiZXR3ZWVuIHRleHR1YWwgcmVwcmVzZW50YXRpb24gKENTVCBub2RlcykgYW5kIEFTVCBub2RlLiBUaGUgcGVyZm9ybWFuY2UgaW1wYWN0CitpcyBhY2NlcHRhYmxlLiBGdW5jdGlvbmFsaXR5IHN1Y2ggYXMgIk1hcmsgT2NjdXJyZW5jZXMiIGRvIG5vdCByZXNvcnQgdG8gZXhwbG9yaW5nCit0aGUgdGV4dHVhbCBkb2N1bWVudC4gSW5zdGVhZCwgdGhlIChvZmZzZXQsIGxlbmd0aCkgcGFpciBpcyB1c2VkIHRvIGdldCBhIENTVAorbm9kZSwgZnJvbSB3aGljaCBhbiBBU1Qgbm9kZSBjYW4gYmUgZm91bmQsIG1ha2luZyBmb3Igcm9idXN0IG5hdmlnYXRpb24uIDwvcD4KKworPHA+VGhlIGF2YWlsYWJpbGl0eSBvZiBDU1QsIEFTVCBhbmQgdGhlaXIgYnJpZGdpbmcgd2lsbCBsaWtlbHkKK3NpbXBsaWZ5IHRoZSBpbnRyb2R1Y3Rpb24gb2YgbmV3IGZ1bmN0aW9uYWxpdHkuIDwvcD4KKworPGgyPk5ldyBHVUkgZmVhdHVyZXM8L2gyPgorCis8dGFibGUgYm9yZGVyPTEgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0wPgorIDx0ciBzdHlsZT0ncGFnZS1icmVhay1pbnNpZGU6YXZvaWQnPgorICA8dGQgd2lkdGg9MzExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjIzMy4xcHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48aW1nIGJvcmRlcj0wIHdpZHRoPTI3OCBoZWlnaHQ9MjY5CisgIHNyYz0iR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwMS5naWYiPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTIyMyBjb2xzcGFuPTIgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MTY3LjNwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLWxlZnQ6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+VGhlIE91dGxpbmUgdmlldyBub3cgZGlzcGxheXMgdGhlIHNhbWUgZWxlbWVudHMgYXMgdGhlCisgIFNhbXBsZSBFY29yZSBFZGl0b3IsIHRvb2xiYXIgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBoaWRpbmcvc2hvd2luZworICBhbm5vdGF0aW9ucywgYXR0cmlidXRlcywgcmVmZXJlbmNlcywgb3BlcmF0aW9ucy4gPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdwYWdlLWJyZWFrLWluc2lkZTphdm9pZCc+CisgIDx0ZCB3aWR0aD0zMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjMzLjFwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbD48aW1nIGJvcmRlcj0wIHdpZHRoPTMxOSBoZWlnaHQ9MjA4CisgIHNyYz0iR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwMi5naWYiPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPiZuYnNwOzwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTIyMyBjb2xzcGFuPTIgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MTY3LjNwdDtib3JkZXItdG9wOm5vbmU7CisgIGJvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+TWFyayBvY2N1cnJlbmNlcyBoaWdobGlnaHRzIHVzYWdlcyBvZiB0aGUgc2FtZQorICBFQ2xhc3NpZmllciwgcmFuZ2UgaW5kaWNhdGlvbiBvbiB0aGUgdmVydGljYWwgYmFyIHNwYW5zIHRoZSBFQ2xhc3NpZmllcgorICBkZWNsYXJhdGlvbi48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbD4mbmJzcDs8L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbD4mbmJzcDs8L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHIgc3R5bGU9J3BhZ2UtYnJlYWstaW5zaWRlOmF2b2lkJz4KKyAgPHRkIHdpZHRoPTMxMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyMzMuMXB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPiZuYnNwOzwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPjxpbWcgYm9yZGVyPTAgd2lkdGg9MjY2IGhlaWdodD0xMDMKKyAgc3JjPSJHVUlGZWF0dXJlcy1EYXRlaWVuL2ltYWdlMDAzLmdpZiI+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+Jm5ic3A7PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWw+PGltZyBib3JkZXI9MCB3aWR0aD0zMTAgaGVpZ2h0PTE1OAorICBzcmM9IkdVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMDQuZ2lmIj48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbD4mbmJzcDs8L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbD4mbmJzcDs8L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbD4mbmJzcDs8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0yMjMgY29sc3Bhbj0yIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjE2Ny4zcHQ7Ym9yZGVyLXRvcDpub25lOworICBib3JkZXItbGVmdDpub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsPkZvbGRpbmcgaXMgc3VwcG9ydGVkLCB3aXRoIGFuIGFubm90YXRpb24gaG92ZXIgZm9yCisgIGNvbGxhcHNlZCByZWdpb25zLiA8L3A+CisgICAKKyAgPC90ZD4KKyA8L3RyPgorIDx0ciBzdHlsZT0ncGFnZS1icmVhay1pbnNpZGU6YXZvaWQnPgorICA8dGQgd2lkdGg9NTM0IGNvbHNwYW49MyB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo0MDAuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgIAorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdwYWdlLWJyZWFrLWluc2lkZTphdm9pZCc+CisgIDx0ZCB3aWR0aD01MzQgY29sc3Bhbj0zIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjQwMC40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICAgCisgIDxwPlByb2JsZW0gYW5kIHdhcm5pbmcgbWFya2VycyAod2l0aCBzcXVpZ2dsaWVzKSBhcmUgdXBkYXRlZCBhZnRlcgorICBlYWNoIGtleXN0cm9rZS4gPC9wPgorICAgCisgIDxwIGNsYXNzPU1zb05vcm1hbCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48aW1nIGJvcmRlcj0wCisgIHdpZHRoPTU3NiBoZWlnaHQ9MzA0IHNyYz0iR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwNS5qcGciPjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0ciBzdHlsZT0ncGFnZS1icmVhay1pbnNpZGU6YXZvaWQnPgorICA8dGQgd2lkdGg9NTM0IGNvbHNwYW49MyB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo0MDAuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgIAorICA8cD5BdHRlbXB0aW5nIHRvIGdlbmVyYXRlIGFuIC5lbWYgZm9yIGFuIC5lY29yZSB0cmlnZ2VycyBhbgorICBFY29yZVZhbGlkYXRpb24uIEVycm9ycyBhbmQgd2FybmluZ3MgYXJlIHNob3duIGluIHRoZSBQcm9ibGVtcyB2aWV3LCBnZW5lcmF0aW9uCisgIGlzIHN0aWxsIGFsbG93ZWQgaWYgdGhlcmUgYXJlIG9ubHkgd2FybmluZ3MuIDwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxpbWcgYm9yZGVyPTAKKyAgd2lkdGg9NTQzIGhlaWdodD0zNzAgc3JjPSJHVUlGZWF0dXJlcy1EYXRlaWVuL2ltYWdlMDA2LmdpZiI+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+Jm5ic3A7PC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdwYWdlLWJyZWFrLWluc2lkZTphdm9pZCc+CisgIDx0ZCB3aWR0aD00MzIgY29sc3Bhbj0yIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjMyMy43NXB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgIAorICAgCisgIDxwPjxpbWcgYm9yZGVyPTAgd2lkdGg9NDQ4IGhlaWdodD0xNTUKKyAgc3JjPSJHVUlGZWF0dXJlcy1EYXRlaWVuL2ltYWdlMDA3LmdpZiI+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MTAyIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjc2LjY1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHA+VGhlIHNlbGVjdGVkIG91dGxpbmUgbm9kZSBmb2xsb3dzIHRoZSBjdXJzb3IgcG9zaXRpb24gaW4KKyAgdGhlIHRleHQgPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdwYWdlLWJyZWFrLWluc2lkZTphdm9pZCc+CisgIDx0ZCB3aWR0aD01MzQgY29sc3Bhbj0zIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjQwMC40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cD48aW1nIGJvcmRlcj0wIHdpZHRoPTQ0NyBoZWlnaHQ9OTMKKyAgc3JjPSJHVUlGZWF0dXJlcy1EYXRlaWVuL2ltYWdlMDA4LmdpZiI+PC9wPgorICAgCisgIDxwPk5hdmlnYWJsZSBoeXBlcmxpbmtzIChmcm9tIHVzYWdlcyBvZiBjbGFzc2lmaWVycyBhbmQgdHlwZQorICB2YXJpYWJsZXMgdG8gdGhlaXIgZGVjbGFyYXRpb25zKTwvcD4KKyAgIAorICA8cD5IeXBlcmxpbmtzIGFyZSB2ZXJ5IGhhbmR5IGZvciBleGFtcGxlIHRvIGZvbGxvdyBhbgorICBlT3Bwb3NpdGUgdG8gaXRzIGRlY2xhcmF0aW9uIChhbHRlcm5hdGl2ZWx5LCBsZXR0aW5nIHRoZSBtb3VzZSBjdXJzb3IgcmVzdCBvdmVyCisgIGFuIGVPcHBvc2l0ZSBkaXNwbGF5cyBpdHMgZGVmaW5pdGlvbiBpbiBhIHRleHQgaG92ZXIsIHNlZSBiZWxvdyk8L3A+CisgICAKKyAgPHA+T3BlbiBkZWNsYXJhdGlvbiBpcyBhbHNvIHN1cHBvcnRlZCwgaS5lLiBwcmVzc2luZyBGMyAob3IKKyAgd2hhdGV2ZXIga2V5IGJpbmRpbmcgaXMgaW4gZWZmZWN0IGZvciBpdCkgbW92ZXMgdGhlIGN1cnNvciB0byB0aGUKKyAgZGVjbGFyYXRpb24uPC9wPgorICAgCisgIDwvdGQ+CisgPC90cj4KKyA8dHIgc3R5bGU9J3BhZ2UtYnJlYWstaW5zaWRlOmF2b2lkJz4KKyAgPHRkIHdpZHRoPTUzNCBjb2xzcGFuPTMgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NDAwLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwPkEgPGk+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyIIU8L2k+IHdpemFyZCBpcyBhdmFpbGFibGUsCisgIHdoaWNoIGluaXRpYWxpemVzIHRoZSBqdXN0IGNyZWF0ZWQgLmVtZiBmaWxlIHRvIGEgc3ludGFjdGljYWxseSBjb3JyZWN0CisgIHN0YXRlOiA8L3A+CisgIDxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mbmJzcDs8L3NwYW4+PC9wPgorICA8cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz5AbmFtZXNwYWNlKDwvc3Bhbj48L3A+CisgIDxwIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz6gIHVyaT08L3NwYW4+PGI+CisgIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eSc+JnF1b3Q7aHR0cDovL2EuYi5jL3gveS9aJnF1b3Q7PC9zcGFuPjwvYj4KKyAgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+LCA8L3NwYW4+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIGxhbmc9REUKKyAgc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+oCBwcmVmaXg9PC9zcGFuPjxiPjxzcGFuCisgIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eSc+JnF1b3Q7cCZxdW90Ozwvc3Bhbj48L2I+PHNwYW4KKyAgc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+KTwvc3Bhbj48L3A+CisgIDxwIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnknPnBhY2thZ2U8L3NwYW4+PC9iPjxzcGFuCisgIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiB0b3A7PC9zcGFuPjwvcD4KKyAgIAorICA8cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48aW1nIGJvcmRlcj0wCisgIHdpZHRoPTI5NyBoZWlnaHQ9MzcxIHNyYz0iR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAwOS5qcGciPjwvcD4KKyAgIAorICA8L3RkPgorIDwvdHI+CisgPHRyIHN0eWxlPSdwYWdlLWJyZWFrLWluc2lkZTphdm9pZCc+CisgIDx0ZCB3aWR0aD01MzQgY29sc3Bhbj0zIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjQwMC40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICAgCisgIDxwPkhvdmVycyBmb3IgdXNhZ2VzIG9mIGNsYXNzaWZpZXJzLCB0eXBlIHBhcmFtZXRlcgorICB2YXJpYWJsZXMsIGFuZCBlT3Bwb3NpdGUgcmVmZXJlbmNlczogdGhlIGRlZmluaXRpb24gaXMgc2hvd24uIDwvcD4KKyAgIAorICA8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGltZyBib3JkZXI9MAorICB3aWR0aD00OTUgaGVpZ2h0PTI0MSBzcmM9IkdVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTAuZ2lmIj48L3A+CisgICAKKyAgPC90ZD4KKyA8L3RyPgorIDx0ciBoZWlnaHQ9MD4KKyAgPHRkIHdpZHRoPTQyNiBzdHlsZT0nYm9yZGVyOm5vbmUnPjwvdGQ+CisgIDx0ZCB3aWR0aD0xMjEgc3R5bGU9J2JvcmRlcjpub25lJz48L3RkPgorICA8dGQgd2lkdGg9MTAyIHN0eWxlPSdib3JkZXI6bm9uZSc+PC90ZD4KKyA8L3RyPgorPC90YWJsZT4KKworIAorCis8dGFibGUgY2xhc3M9TXNvVGFibGVHcmlkIGJvcmRlcj0xIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MAorIHN0eWxlPSdib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyOm5vbmUnPgorIDx0ciBzdHlsZT0ncGFnZS1icmVhay1pbnNpZGU6YXZvaWQnPgorICA8dGQgd2lkdGg9MTc1IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjEzMS40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgICAKKyAgPHA+PGltZyBib3JkZXI9MCB3aWR0aD0xNDYgaGVpZ2h0PTgyCisgIHNyYz0iR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAxMS5naWYiPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTQxNSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDozMTEuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItbGVmdDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgICAKKyAgPHA+QXV0b0VkaXRzPC9wPgorICAgCisgIDxwPjxiPlNtYXJ0QnJhY2U8L2I+OiB0eXBpbmcgYW4gb3BlbmluZyBicmFjZSBhdXRvbWF0aWNhbGx5CisgIGFkZHMgaXRzIGNsb3NpbmcgYnJhY2UgYW5kIGxlYXZlcyB0aGUgY3Vyc29yIGluZGVudGVkIG9uIGl0cyBvd24gbGluZSAoZW5kCisgIHJlc3VsdCBzaG93biBsZWZ0KSA8L3A+CisgICAKKyAgPHA+QmVzaWRlcyB0aGF0IHN0cmF0ZWd5IHRoZSB1c3VhbCBvbmVzOiA8L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6MjQuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPi08c3BhbgorICBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisgIDwvc3Bhbj5EZWZhdWx0SW5kZW50TGluZTwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDoyNC4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+LTxzcGFuCisgIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKyAgPC9zcGFuPkNsb3NpbmcgcXVvdGUgZm9yIG9wZW5pbmcgcXVvdGU8L3A+CisgICAKKyAgPC90ZD4KKyA8L3RyPgorIDx0ciBzdHlsZT0ncGFnZS1icmVhay1pbnNpZGU6YXZvaWQnPgorICA8dGQgd2lkdGg9NTkwIGNvbHNwYW49MiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo0NDIuOHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgIAorICA8cD5QcmVmZXJlbmNlIHBhZ2VzLCB0byBjb250cm9sIEF1dG9FZGl0cyBhbmQgdGVtcGxhdGVzIChzZWUKKyAgZXhhbXBsZSBiZWxvdyk8L3A+CisgICAKKyAgPHAgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxpbWcgYm9yZGVyPTAKKyAgd2lkdGg9NDY2IGhlaWdodD0yNjkgc3JjPSJHVUlGZWF0dXJlcy1EYXRlaWVuL2ltYWdlMDEyLmpwZyI+PC9wPgorICAgCisgIDwvdGQ+CisgPC90cj4KKyA8dHIgc3R5bGU9J3BhZ2UtYnJlYWstaW5zaWRlOmF2b2lkJz4KKyAgPHRkIHdpZHRoPTU5MCBjb2xzcGFuPTIgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NDQyLjhwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgICAKKyAgPHA+QSB0ZW1wbGF0ZSBmb3IgZWFjaCBraW5kIG9mIGFubm90YXRpb24gc2F2ZXMgdHlwaW5nLiBJbgorICB0aGUgZXhhbXBsZSwgdGhlIHRlbXBsYXRlIGRlZmluaXRpb24gZm9yIGFkZGluZyBPQ0wgaW52YXJpYW50cyBpcyBzaG93biAodGhlCisgIGVycm9yIG1hcmtlciBpcyB0cmFuc2llbnQsIG9uY2UgdGhlIHRlbXBsYXRlIGlzIGluc2VydGVkIGl0IGRpc2FwcGVhcnMpIDwvcD4KKyAgIAorICA8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGltZyBib3JkZXI9MAorICB3aWR0aD01NzYgaGVpZ2h0PTE1NSBzcmM9IkdVSUZlYXR1cmVzLURhdGVpZW4vaW1hZ2UwMTMuZ2lmIj48L3A+CisgICAKKyAgPHA+YWZ0ZXIgY2hvb3NpbmcgdGhlIHRlbXBsYXRlIGFib3ZlPC9wPgorICAgCisgIDxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxpbWcgYm9yZGVyPTAKKyAgd2lkdGg9NDM4IGhlaWdodD0xMzUgc3JjPSJHVUlGZWF0dXJlcy1EYXRlaWVuL2ltYWdlMDE0LmdpZiI+PC9wPgorICAgCisgIDwvdGQ+CisgPC90cj4KKzwvdGFibGU+CisKKyAKKworPGgyPjxhIG5hbWU9Il9Ub2MxNTkzMDU1MTUiPlNob3cgaW4gRU1GIFR5cGUgSGllcmFyY2h5PC9hPjwvaDI+CisKKyAKKworPHA+k1Nob3cgaW4gRU1GIFR5cGUgSGllcmFyY2h5lCBjYW4gYmUgYWN0aXZhdGVkIGZyb20gdGhlCitlZGl0b3IgYW5kIGZyb20gdGhlIG91dGxpbmUgdmlldzwvcD4KKworPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGltZyBib3JkZXI9MAord2lkdGg9MzkxIGhlaWdodD0xNjMgc3JjPSJHVUlGZWF0dXJlcy1EYXRlaWVuL2ltYWdlMDE1LmpwZyI+PC9wPgorCisgCisKKzxwPlRoZSBzdXBlcnR5cGUgYW5kIHN1YnR5cGUgcmVsYXRpb25zaGlwcyBjYW4gYmUgZm9sbG93ZWQsCit3aXRoIGEgbGlzdCBvZiAoaW5oZXJpdGVkKSBjbGFzcyBtZW1iZXJzIGRpc3BsYXllZCBvbiB0aGUgbG93ZXIgcGFuZS4KK0RvdWJsZS1jbGlja2luZyBvbiBhbnkgb2YgdGhlc2UgZWxlbWVudHMgbmF2aWdhdGVzIGluIHRoZSBlZGl0b3IgdG8gaXRzCitkZWNsYXJhdGlvbi4gPC9wPgorCisgCisKKzxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxpbWcgYm9yZGVyPTAKK3dpZHRoPTM2NSBoZWlnaHQ9NTA2IHNyYz0iR1VJRmVhdHVyZXMtRGF0ZWllbi9pbWFnZTAxNi5naWYiPjwvcD4KKworIAorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvaHRtbC9nZXR0aW5nc3RhcnRlZC9leGFtcGxlLmh0bWwgYi9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvaHRtbC9nZXR0aW5nc3RhcnRlZC9leGFtcGxlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwNzUzZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL2dldHRpbmdzdGFydGVkL2V4YW1wbGUuaHRtbApAQCAtMCwwICsxLDExMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+CisKKzxoZWFkPgorICA8bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIKKyBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiPgorICA8dGl0bGU+RW1mYXRpYyBHZXR0aW5nIFN0YXJ0ZWQgR3VpZGU8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8aDE+RW1mYXRpYyBHZXR0aW5nIFN0YXJ0ZWQgR3VpZGU8L2gxPgorYnkgQ2hyaXMgRGFseSAoY2pkYWx5QHVzLmlibS5jb20pPGJyPgorQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA0PGJyPgorPGJyPgorPGhyIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAycHg7Ij48YnI+Cis8YnI+CitFbWZhdGljIGlzIGEgbGFuZ3VhZ2UgZGVzaWduZWQgdG8gcmVwcmVzZW50IEVNRiBFY29yZSBtb2RlbHMgaW4gYQordGV4dHVhbCBmb3JtLiZuYnNwOyBUaGlzIGRvY3VtZW50IHNob3dzIHRoZSBiYXNpYyBzdGVwcyBpbnZvbHZlZCBpbgord29ya2luZyB3aXRoIEVtZmF0aWMuPGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+UGxlYXNlIHNlZSB0aGUgPC9zcGFuPjxzcGFuCisgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FbWZhdGljIExhbmd1YWdlCitSZWZlcmVuY2U8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+IGZvciBhIGZ1bGwKK2V4cGxhbmF0aW9uIG9mIHRoZSBzeW50YXggYW5kIHNlbWF0aWNzIG9mIHRoZSBFbWZhdGljIGxhbmd1YWdlLjwvc3Bhbj48YnI+Cis8YnI+CitJbiB0aGlzIGRvY3VtZW50LCBFbWZhdGljIHByb2dyYW1zIGFyZSBzaG93biBpbiBib3hlcworYXMgaW4gdGhlIGV4YW1wbGUgYmVsb3c6PGJyPgorPGJyPgorPHRhYmxlCisgc3R5bGU9IndpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IgorIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIyIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnBhY2thZ2UgdGVzdDs8YnI+CitjbGFzcyBGb28geyB9PC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KK1doZW4gY29tcGlsZWQsIHRoZSBwcm9ncmFtIGFib3ZlIHdpbGwgcHJvZHVjZSBhIG1vZGVsIHdpdGggYW4gPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FUGFja2FnZTwvc3Bhbj4gbmFtZWQgInRlc3QiIGNvbnRhaW5pbmcgYQorc2luZ2xlIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVDbGFzczwvc3Bhbj4gbmFtZWQgIkZvbyIuPGJyPgorPGJyPgorTGV0J3MgZ28gYWhlYWQgYW5kIGNyZWF0ZSBhbiBFbWZhdGljIGZpbGUgd2l0aCB0aGUgYWJvdmUgc291cmNlIGNvZGU6PGJyPgorPHVsPgorICA8bGk+Q3JlYXRlIGEgbmV3IHByb2plY3Qgb3IgdXNlIGFuIGV4aXN0aW5nIG9uZSBmb3IgdGhlIG5leHQgc3RlcCAoaXQKK2RvZXNuJ3QgbWF0dGVyIHdoYXQga2luZCBvZiBwcm9qZWN0IHlvdSBjaG9vc2Ugb3Igd2hpY2ggRWNsaXBzZQorcGVyc3BlY3RpdmUgeW91IGFyZSBpbikuPC9saT4KKyAgPGxpPkNyZWF0ZSBhIG5ldyBmaWxlIGNhbGxlZCAidGVzdC5lbWYiLjwvbGk+CisgIDxsaT5FbnRlciB0aGUgdHdvIGxpbmVzIGZyb20gdGhlIGJveCBhYm92ZSBpbiB0ZXN0LmVtZi48L2xpPgorICA8bGk+U2F2ZSB0ZXN0LmVtZi48L2xpPgorICA8bGk+SW4gdGhlIE5hdmlnYXRvciB2aWV3IChvciBQYWNrYWdlIEV4cGxvcmVyKSwgcmlnaHQtY2xpY2sgb24KK3Rlc3QuZW1mIGFuZCBzZWxlY3QgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+R2VuZXJhdGUgRWNvcmUKK01vZGVsPC9zcGFuPi48YnI+CisgIDwvbGk+Cis8L3VsPgorTm93IHlvdSBzaG91bGQgc2VlIGEgbmV3IGZpbGUgY2FsbGVkICJ0ZXN0LmVjb3JlIiBpbiB0aGUgTmF2aWdhdG9yIChJbgordGhlIHNhbWUgZm9sZGVyIGFzIHRlc3QuZW1mKS4mbmJzcDsgVHJ5IHRoZSBmb2xsb3dpbmc6PGJyPgorPHVsPgorICA8bGk+T3BlbiB0ZXN0LmVjb3JlICh1c2luZyB0aGUgZGVmYXVsdCBFTUYgRWNvcmUgbW9kZWwgZWRpdG9yKTwvbGk+CisgIDxsaT5SaWdodC1jbGljayBvbiB0aGUgRVBhY2thZ2UgInRlc3QiIGFuZCBzZWxlY3QgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5OZXcgQ2hpbGQ8L3NwYW4+IC0mZ3Q7IDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RUNsYXNzPC9zcGFuPi48L2xpPgorICA8bGk+U2VsZWN0IHRoZSBuZXcgRUNsYXNzLCByaWdodC1jbGljayBhbmQgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5TaG93IFByb3BlcnRpZXMgVmlldzwvc3Bhbj4uPC9saT4KKyAgPGxpPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGVudGVyIHRoZSBuYW1lICJCYXIiIGZvciB0aGUgRUNsYXNzPC9saT4KKyAgPGxpPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IEFic3RyYWN0Cit0byB0cnVlLjwvbGk+CisgIDxsaT5TYXZlIHRlc3QuZWNvcmUuPC9saT4KKyAgPGxpPkluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2sgb24gdGVzdC5lY29yZSBhbmQgc2VsZWN0IDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+R2VuZXJhdGUgRW1mYXRpYyBTb3VyY2U8L3NwYW4+Ljxicj4KKyAgPC9saT4KKzwvdWw+CitMb29rIGF0IHRlc3QuZW1mIGFnYWluLiZuYnNwOyBJdCBzaG91bGQgbm93IGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczo8YnI+Cis8YnI+Cis8dGFibGUKKyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogbGVmdDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiCisgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjIiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+cGFja2FnZSB0ZXN0Ozxicj4KKyAgICAgIDxicj4KK2NsYXNzIEZvbyB7PGJyPgorfTxicj4KKyAgICAgIDxicj4KK2Fic3RyYWN0IGNsYXNzIEJhciB7PGJyPgorfTxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+Cis8YnI+CitZb3UgaGF2ZSBub3cgc2VlbiB0aGUgYmFzaWMgc3RlcHMgaW52b2x2ZWQgaW4gd29ya2luZyB3aXRoCitFbWZhdGljLjxicj4KKzxicj4KK0hlcmUgYXJlIGEgZmV3IGtleSBwb2ludHMgdG8gc3RyZXNzOjxicj4KKzx1bD4KKyAgPGxpPkVtZmF0aWMgc291cmNlIGZpbGVzIHVzZSB0aGUgZXh0ZW5zaW9uIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4uZW1mPC9zcGFuPjwvbGk+CisgIDxsaT5TYXZlIHlvdXIgRW1mYXRpYyBhbmQgRWNvcmUgZmlsZXMgYmVmb3JlIGludm9raW5nIHRoZSAiR2VuZXJhdGUiCithY3Rpb25zIChFbWZhdGljIHJlYWRzIHRoZSBmaWxlIGZyb20gZGlzayByYXRoZXIgdGhhbiBsb29raW5nIGF0IHRoZQorY29udGVudHMgb2YgdGhlIGVkaXRvcik8L2xpPgorICA8bGk+RW1mYXRpYyB3aWxsIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBhcyB5b3UgaW52b2tlIHRoZQorIkdlbmVyYXRlIiBhY3Rpb25zLCBzbyBiZSBjYXJlZnVsITwvbGk+Cis8L3VsPgorPGJyPgorPGJyPgorPC9ib2R5PgorCisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvaHRtbC9yZWZlcmVuY2UvRW1mYXRpYzAwMlVwZGF0ZS5odG1sIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvcmVmZXJlbmNlL0VtZmF0aWMwMDJVcGRhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTk3MzY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvcmVmZXJlbmNlL0VtZmF0aWMwMDJVcGRhdGUuaHRtbApAQCAtMCwwICsxLDIyMSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKyAgPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiCisgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIj4KKyAgPHRpdGxlPkVtZmF0aWMgMC4wLjIgUmVsZWFzZSBOb3RlPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPkVtZmF0aWMgMC4wLjIgUmVsZWFzZSBOb3RlPC9oMT4KK2J5IENocmlzIERhbHkgKGNqZGFseUB1cy5pYm0uY29tKTxicj4KK0NvcHlyaWdodCBJQk0gQ29ycC4gMjAwNDxicj4KKzxicj4KKzxicj4KK1RoZSAwLjAuMiByZWxlYXNlIG9mIEVtZmF0aWMgaW50cm9kdWNlcyBzZXZlcmFsIHNtYWxsIGNoYW5nZXMgaW4gdGhlCithcmVhIG9mIGFubm90YXRpb25zIGFuZCBkYXRhdHlwZXMuJm5ic3A7IFRoZSBpbnRlbnQgb2YgdGhlIGNoYW5nZXMgaXMKK3RvIGZpeCBwcm9ibGVtcyB3aXRoIHRoZSBtYXBwaW5nIGJldHdlZW4gRW1mYXRpYyBhbmQgRWNvcmUgYW5kIHRvCiticmluZyB0aGUgRW1mYXRpYyBhbm5vdGF0aW9uIHN5bnRheCBjbG9zZXIgaW4gbGluZSB3aXRoIHRoYXQgb2YgSmF2YQorMS41IGFubm90YXRpb25zLjxicj4KKzxicj4KKzxoMz4xLiBDaGFuZ2VzIHRvIEFubm90YXRpb25zPC9oMz4KK0ZvbGxvd2luZyBhcmUgZXhhbXBsZXMgdGhhdCBleHBsYWluIHRoZSB1c2Ugb2YgYW5ub3RhdGlvbnMgaW4gRW1mYXRpYworMC4wLjIgYW5kIHRoZSBjaGFuZ2VzIGZyb20gdGhlIDAuMC4xIHJlbGVhc2UuPGJyPgorPGJyPgorSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSB0ZXh0IDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+YW5uPC9zcGFuPgoraXMgdXNlZCBhcyB0aGUgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+c291cmNlPC9zcGFuPiB2YWx1ZQordHdpY2UgaW4gdGhlIGNvbnRleHQgb2YgYSBzaW5nbGUgZWxlbWVudC4mbmJzcDsgUHJldmlvdXNseSBFbWZhdGljIG1hZGUKK2FuIGF0dGVtcHQgdG8gY29tYmluZSBtdWx0aXBsZSBhbm5vdGF0aW9ucyB3aXRoIHRoZSBzYW1lIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+c291cmNlPC9zcGFuPiB2YWx1ZSBpbnRvIGEgc2luZ2xlCithbm5vdGF0aW9uLiZuYnNwOyBIb3dldmVyIEVjb3JlIGFsbG93cyBtdWx0aXBsZSBhbm5vdGF0aW9ucyBvZiBhIG1vZGVsCitlbGVtZW50IHRvIHVzZSB0aGUgc2FtZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5zb3VyY2U8L3NwYW4+Cit2YWx1ZS4mbmJzcDsgU28gdGhlIEVtZmF0aWMgMC4wLjEgbWFwcGluZyBmYWlsZWQgdG8gYWxsb3cgRWNvcmUgbW9kZWxzCit3aXRoIHRoaXMgcGF0dGVybiBvZiBhbm5vdGF0aW9uIHVzZSB0byBiZSBjcmVhdGVkLiZuYnNwOyBXaXRoIDAuMC4yLAordGhlIGNvZGUgYmVsb3cgd2lsbCBwcm9kdWNlIHR3byBhbm5vdGF0aW9ucywgYm90aCB3aXRoIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+c291cmNlPC9zcGFuPiBzZXQgdG8gPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmFubjwvc3Bhbj4sIGZvciB0aGUgY2xhc3MgaW4gdGhlIG1vZGVsLjxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij48c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+cGFja2FnZSBwOzwvc3Bhbj48YnIKKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorICAgICAgPGJyIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+CisgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkBhbm4oaz0idiIpPC9zcGFuPjxicgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+CisgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkBhbm4oaz0idjIiKTwvc3Bhbj48YnIKKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5jbGFzcyBDIHsgfTwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorPGJyPgorPGJyPgorPGJyPgorQW5vdGhlciBwcm9ibGVtIHdpdGggRW1mYXRpYyAwLjAuMSBjYXVzZWQgYW5ub3RhdGlvbiBkZXRhaWxzIHRvIGJlCit3cml0dGVuIGluIGEgZGlmZmVyZW50IG9yZGVyIHRoYW4gdGhlaXIgYWN0dWFsIG9yZGVyIGluIHRoZSBFY29yZSBtb2RlbC48YnI+Cis8YnI+Cis8dGFibGUKKyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogbGVmdDsiCisgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjIiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+PHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnBhY2thZ2UgcDs8L3NwYW4+PGJyCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4KKyAgICAgIDxiciBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5AYW5uKGsxPSJ2MSIsIGsyPSJ2MiIsCitrMz0idjMiKTwvc3Bhbj48YnIgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4KKyAgICAgIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+Y2xhc3MgQyB7IH08L3NwYW4+PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KK1RoZSBleGFtcGxlIGFib3ZlIHNob3dzIGFuIGFubm90YXRpb24gd2l0aCAzIGtleS92YWx1ZSBkZXRhaWwKK3BhaXJzLiZuYnNwOyBHZW5lcmF0aW5nIEVjb3JlIGZyb20gdGhpcyBhbmQgdGhlbiBnZW5lcmF0aW5nIEVtZmF0aWMKK2Zyb20gdGhlIEVjb3JlIGNvdWxkIHJlc3VsdCBpbiB0aGUgYW5ub3RhdGlvbiBkZXRhaWxzIGFwcGVhcmluZyBpbiBhCitkaWZmZXJlbnQgb3JkZXIuJm5ic3A7IFdpdGggRW1mYXRpYyAwLjAuMiB5b3Ugd2lsbCBiZSBhYmxlIHRvIGdvIGZyb20KK0VtZmF0aWMgdG8gRWNvcmUgYW5kIGZyb20gRWNvcmUgYmFjayB0byBFbWZhdGljIGFuZCB0aGUgb3JkZXIgb2YKK2RldGFpbHMgaW4gYW4gYW5ub3RhdGlvbiAoYXMgd2VsbCBhcyB0aGUgb3JkZXIgb2YgYW5ub3RhdGlvbnMgb24gYW4KK2VsZW1lbnQpIHdpbGwgYmUgcHJlc2VydmVkLjxicj4KKzxicj4KKzxicj4KKzxicj4KK0ZpbmFsbHksIEVtZmF0aWMgMC4wLjIgYWxsb3dzIGEgZm9ybSBvZiBhbm5vdGF0aW9uIHNpbWlsYXIgdG8gdGhlIEphdmEKKzEuNSBhbm5vdGF0aW9uIHN0eWxlIHdoZXJlIGEgdmFsdWUgaXMgaW5kaWNhdGVkLCBidXQgdGhlIGtleSBpcyBub3QKK25hbWVkLiZuYnNwOyBJdCBzaG91bGQgYmUgYXMgc2ltcGxlIGFzIG9taXR0aW5nIHRoZSBrZXksIGxpa2UgdGhpczo8YnI+Cis8YnI+Cis8dGFibGUKKyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogbGVmdDsiCisgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjIiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+PHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnBhY2thZ2UgcDs8L3NwYW4+PGJyCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4KKyAgICAgIDxiciBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5AYW5uKCJoZWxsbyIpPC9zcGFuPjxicgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+CisgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmNsYXNzIEMgeyB9PC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitIb3dldmVyIHRoZSBhYm92ZSBjb2RlIHdpbGwgcHJvZHVjZSBhIHdhcm5pbmcuJm5ic3A7IFRvIHByb3Blcmx5IHVzZQordGhpcyBzeW50YXggeW91IG11c3QgZGVjbGFyZSB0aGUgbmFtZXMgb2YgYW55ICJpbXBsaWNpdCIgYW5ub3RhdGlvbgora2V5cyB1c2luZyB0aGUgRW1mYXRpY0Fubm90YXRpb25NYXAuJm5ic3A7IFRoZSBFbWZhdGljQW5ub3RhdGlvbk1hcCB3YXMKK2ludHJvZHVjZWQgZm9yIEVtZmF0aWMgMC4wLjEgYXMgYSB3YXkgdG8gcmVwbGFjZSBsb25nIHNvdXJjZSBVUklzIHdpdGgKK3Nob3J0IGxhYmVscyBpbiBFbWZhdGljIGNvZGUuJm5ic3A7IE5vdyB0aGUgZm9ybSBvZgorRW1mYXRpY0Fubm90YXRpb25NYXAgdXNhZ2UgaGFzIGJlZW4gbW9kaWZpZWQgc2xpZ2h0bHkgdG8gYWxsb3cgaW1wbGljaXQKK2tleSBuYW1lcyB0byBiZSBkZWZpbmVkIGFzIHdlbGwuJm5ic3A7IFRoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyB0bworY3JlYXRlIGEgbGFiZWwgY2FsbGVkICJhbm4iIHdpdGggYW4gaW1wbGljaXQga2V5IG5hbWVkICJrZXkiIG1hcHBlZCB0bwordGhlIHNvdXJjZSBVUkkgImh0dHA6Ly9hbm4tdXJpIi48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPjwvc3Bhbj48YnI+Cis8YnI+Cis8dGFibGUKKyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogbGVmdDsiCisgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjIiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+PHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkBFbWZhdGljQW5ub3RhdGlvbk1hcCgiYW5uKGtleSkiPSJodHRwOi8vYW5uLXVyaSIpPC9zcGFuPjxicgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+CisgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnBhY2thZ2UgcDs8L3NwYW4+PGJyCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4KKyAgICAgIDxiciBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5AYW5uKCJoZWxsbyIpIC8vIGxpa2UKK3NheWluZyBAYW5uKGtleT0iaGVsbG8iKTwvc3Bhbj48YnIgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4KKyAgICAgIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+Y2xhc3MgQyB7IH08L3NwYW4+PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KK0JlbG93IGlzIGFub3RoZXIgZXhhbXBsZSB0aGF0IHNob3dzIGhvdyBtb2RlbCBkb2N1bWVudGF0aW9uIGFubm90YXRpb25zCitjYW4gYmUgc2ltcGxpZmllZCBieSB1c2luZyB0aGlzIHN0eWxlIG9mIGFubm90YXRpb24gc3ludGF4Ljxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij48c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QEVtZmF0aWNBbm5vdGF0aW9uTWFwKCJkb2MoZG9jdW1lbnRhdGlvbikiPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIik8L3NwYW4+PGJyCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4KKyAgICAgIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+cGFja2FnZSBwOzwvc3Bhbj48YnIKKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorICAgICAgPGJyIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+CisgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkBkb2MoIm15IG1vZGVsCitkb2N1bWVudGF0aW9uIik8L3NwYW4+PGJyIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+CisgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmNsYXNzIEMgeyB9PC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitIZXJlIGlzIGEgZmluYWwgZXhhbXBsZSBzaG93aW5nIGhvdyBtb3JlIHRoYW4gb25lIGltcGxpY2l0IGFubm90YXRpb24KK2tleSBjYW4gYmUgZGVmaW5lZDo8YnI+Cis8YnI+Cis8dGFibGUKKyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogbGVmdDsiCisgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjIiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+PHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkBFbWZhdGljQW5ub3RhdGlvbk1hcCgiYW5uKGtleSkiPSJodHRwOi8vYW5uLVVSSSIpPC9zcGFuPjxicgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+CisgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkBFbWZhdGljQW5ub3RhdGlvbk1hcCgiYW5uKGEsYikiPSJodHRwOi8vYW5uLVVSSSIpPC9zcGFuPjxicgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+CisgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnBhY2thZ2UgcDs8L3NwYW4+PGJyCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4KKyAgICAgIDxiciBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5AYW5uKCJoZWxsbyIpPC9zcGFuPjxicgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+CisgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkBhbm4oIlgiLCAiWSIpPC9zcGFuPjxicgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+CisgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmNsYXNzIEMgeyB9PC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+Cis8YnI+Cis8YnI+Cis8aDM+Mi4gRml4IGZvciBTZXJpYWxpemFibGUgRGF0YXR5cGVzPC9oMz4KKzxicj4KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdGhlIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij50cmFuc2llbnQ8L3NwYW4+IG1vZGlmaWVyIGNhbiBiZSB1c2VkCit0byBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FRGF0YVR5cGU8L3NwYW4+Cis8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5zZXJpYWxpemFibGU8L3NwYW4+IGF0dHJpYnV0ZSBmcm9tIHRoZQorZGVmYXVsdCBvZiB0cnVlIHRvIGZhbHNlLjxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij48c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+cGFja2FnZSBwOzwvc3Bhbj48YnIKKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorICAgICAgPGJyIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+CisgICAgICA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmRhdGF0eXBlIGQxIDogeDs8L3NwYW4+PGJyCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4KKyAgICAgIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+dHJhbnNpZW50IGRhdGF0eXBlIGQyIDogeDs8L3NwYW4+PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KKzxicj4KK0luIHRoZSAwLjAuMSByZWxlYXNlLCB0aGUgZGVmYXVsdCBmb3IgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+c2VyaWFsaXphYmxlPC9zcGFuPgorYW5kIHRoZSBtZWFuaW5nIG9mIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+dHJhbnNpZW50PC9zcGFuPgord2VyZSBib3RoIGluY29ycmVjdC4mbmJzcDsgVGhpcyBoYXMgYmVlbiBmaXggZm9yIHRoZSAwLjAuMiByZWxlYXNlLjxicj4KKzxicj4KKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL3JlZmVyZW5jZS9FbWZhdGljR3JhbW1hci5odG1sIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL2h0bWwvcmVmZXJlbmNlL0VtZmF0aWNHcmFtbWFyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwM2Y5MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL3JlZmVyZW5jZS9FbWZhdGljR3JhbW1hci5odG1sCkBAIC0wLDAgKzEsNjA0IEBACis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDEwIChmaWx0ZXJlZCkiPgorPHRpdGxlPmxhbmd1YWdlIEVtZmF0aWM7PC90aXRsZT4KKworPHN0eWxlPgorPCEtLQorIC8qIFN0eWxlIERlZmluaXRpb25zICovCisgcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KK0BwYWdlIFNlY3Rpb24xCisJe3NpemU6NjEyLjBwdCA3OTIuMHB0OworCW1hcmdpbjo3MC44NXB0IDcwLjg1cHQgMi4wY20gNzAuODVwdDt9CitkaXYuU2VjdGlvbjEKKwl7cGFnZTpTZWN0aW9uMTt9CistLT4KKzwvc3R5bGU+CisKKzwvaGVhZD4KKworPGJvZHkgbGFuZz1ERT4KKworPGRpdiBjbGFzcz1TZWN0aW9uMT4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibHVlJz5sYW5ndWFnZTwvc3Bhbj48c3BhbiBzdHlsZT0nZm9udC1zaXplOgorOC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IEVtZmF0aWM7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Iic+Jm5ic3A7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibHVlJz5vcHRpb25zPC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LXNpemU6Cis4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4geyBrPTM7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPqCgoKCgoKCgoCBwYXJzZXJQYWNrYWdlTmFtZT08L3NwYW4+PGI+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDtvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLnBhcnNlciZxdW90Ozwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+OyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz6goKCgoKCgoKAgYXN0UGFja2FnZU5hbWU9PC9zcGFuPjxiPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eSc+JnF1b3Q7b3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QmcXVvdDs8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPjsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+oKCgoKCgoKCgIGFzdEJhc2VDbGFzc05hbWU9PC9zcGFuPjxiPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eSc+JnF1b3Q7RW1mYXRpY0FTVE5vZGUmcXVvdDs8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPjs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz6goKCgoKCgIH08L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBjb21wVW5pdCBbZW50cnldCis6IHBhY2thZ2VEZWNsIGltcG9ydFN0bXRzIHRvcExldmVsRGVjbHOgIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBwYWNrYWdlRGVjbCA6IGFubm90YXRpb25zCis8L3NwYW4+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnknPiZxdW90O3BhY2thZ2UmcXVvdDs8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBuYW1lPXF1YWxpZmllZElECitTRU1JIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+bGlzdDwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IHF1YWxpZmllZElEIDoKK2lkMT1JRCAocWlkU2VwYXJhdG9yIGlkbj1JRCkqIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+dG9rZW48L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBxaWRTZXBhcmF0b3IgOgorRE9UIHwgRE9MTEFSIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+YWJzdHJhY3Q8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBzdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRAorOiBzdHJpbmdMaXRlcmFsQ29udGFpbmVyIHwgcXVhbGlmaWVkSURDb250YWluZXIgOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5zZXF1ZW5jZTwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IHN0cmluZ0xpdGVyYWxDb250YWluZXIKKzogU1RSSU5HX0xJVEVSQUwgOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5zZXF1ZW5jZTwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IHF1YWxpZmllZElEQ29udGFpbmVyCis6IHF1YWxpZmllZElEIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+bGlzdDwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IGFubm90YXRpb25zIDogYW5ub3RhdGlvbioKKzs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBhbm5vdGF0aW9uIDogQVQgc291cmNlPXN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElECitMUEFSRU4ga2V5RXF1YWxzVmFsdWVMaXN0IFJQQVJFTiA7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPmxpc3Q8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBrZXlFcXVhbHNWYWx1ZUxpc3QKKzoga3YxPWtleUVxdWFsc1ZhbHVlIChDT01NQSBrdm49a2V5RXF1YWxzVmFsdWUpKiA7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnNlcXVlbmNlPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4ga2V5RXF1YWxzVmFsdWUgOgora2V5PXN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIEVRVUFMUyB2YWx1ZT1zdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCA7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Iic+Jm5ic3A7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPmxpc3Q8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBpbXBvcnRTdG10cyA6IGltcG9ydFN0bXQqCis7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyInPiZuYnNwOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5zZXF1ZW5jZTwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IGltcG9ydFN0bXQgOiA8L3NwYW4+PGI+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDtpbXBvcnQmcXVvdDs8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiAoYWxpYXM9SUQKK0VRVUFMUyk/IHVyaT1zdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBTRU1JIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+bGlzdDwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IHRvcExldmVsRGVjbHMgOiB0b3BMZXZlbERlY2wqCis7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Iic+Jm5ic3A7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPmFic3RyYWN0PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gdG9wTGV2ZWxEZWNsIDogKGFubm90YXRpb25zKQorPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+oCBzdWJQYWNrYWdlRGVjbCB8IGNsYXNzRGVjbCB8IGRhdGFUeXBlRGVjbAorfCBlbnVtRGVjbCB8IG1hcEVudHJ5RGVjbCA7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Iic+Jm5ic3A7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnNlcXVlbmNlPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gc3ViUGFja2FnZURlY2wgOgorPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDtwYWNrYWdlJnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gbmFtZT1JRCBMQ1VSTFkgdG9wTGV2ZWxEZWNscworUkNVUkxZIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBjbGFzc0RlY2wgOiAoYWJzdHJhY3RNb2RpZmllcik/Cis8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz6goKCgoKCgoKCgoKCgoKCgoKCgoCBjbGFzc0tpbmQgbmFtZT1JRCA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz6goKCgoKCgoKCgoKCgoKCgoKCgoCAodHlwZVBhcmFtc0luZm89dHlwZVBhcmFtc0luZm8pPzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPqCgoKCgoKCgoKCgoKCgoKCgoKCgICg8L3NwYW4+PGI+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDtleHRlbmRzJnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gc3VwZXJUeXBlcz1jb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQpPworPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+oKCgoKCgoKCgIKCgoKCgoKCgoKCgKENPTE9OIGluc3RDbGFzc05hbWU9Ym91bmRFeGNlcHRXaWxkY2FyZCk/Cis8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz6goKCgoKCgoKCgoKCgoKCgoKCgoCBMQ1VSTFkgY2xhc3NNZW1iZXJEZWNscworUkNVUkxZIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+bGlzdDwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IGNvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZAorOiB0YjE9Ym91bmRFeGNlcHRXaWxkY2FyZCAoQ09NTUEgdGJuPWJvdW5kRXhjZXB0V2lsZGNhcmQpKjs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBhYnN0cmFjdE1vZGlmaWVyCis6IDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eSc+JnF1b3Q7YWJzdHJhY3QmcXVvdDs8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiA7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnRva2VuPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gY2xhc3NLaW5kIDogPC9zcGFuPjxiPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eSc+JnF1b3Q7Y2xhc3MmcXVvdDs8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiB8IDwvc3Bhbj48Yj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnknPiZxdW90O2ludGVyZmFjZSZxdW90Ozwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiB0eXBlUGFyYW1zSW5mbyA6CitMVCBvbmVPck1vcmVUeXBlUGFyYW1zIEdUIDsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPmxpc3Q8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBvbmVPck1vcmVUeXBlUGFyYW1zCis6IHRwMT10eXBlUGFyYW0gKENPTU1BIHRwbj10eXBlUGFyYW0pKiA7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnNlcXVlbmNlPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gdHlwZVBhcmFtIDogdHlwZVZhck5hbWU9SUQKKyh0eXBlQm91bmRzSW5mbz10eXBlQm91bmRzSW5mbyk/IDsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnNlcXVlbmNlPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gdHlwZUJvdW5kc0luZm8gOgorPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDtleHRlbmRzJnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzCis7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5saXN0PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzCis6IHRiMT1ib3VuZEV4Y2VwdFdpbGRjYXJkIChBTVAgdGJuPWJvdW5kRXhjZXB0V2lsZGNhcmQpKjsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnNlcXVlbmNlPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gYm91bmRFeGNlcHRXaWxkY2FyZAorOiByYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZT1xdWFsaWZpZWRJRCAoTFQgb25lT3JNb3JlVHlwZUFyZ3MgR1QpPyA7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5saXN0PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gb25lT3JNb3JlVHlwZUFyZ3MKKzogdGExPXR5cGVBcmcgKENPTU1BIHRhbj10eXBlQXJnKSo7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPmFic3RyYWN0PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gdHlwZUFyZyA6IGJvdW5kRXhjZXB0V2lsZGNhcmQKK3wgd2lsZGNhcmSgIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiB3aWxkY2FyZCA6IFFNQVJLCisoIGV4dGVuZHNPclN1cGVyIGJvdW5kRXhjZXB0V2lsZGNhcmQgKT8gOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+dG9rZW48L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBleHRlbmRzT3JTdXBlciA6Cis8L3NwYW4+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnknPiZxdW90O2V4dGVuZHMmcXVvdDs8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiB8IDwvc3Bhbj48Yj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnknPiZxdW90O3N1cGVyJnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnk7YmFja2dyb3VuZDpncmF5Jz4vLyB0aGVyZSBhcmUgbm8gYXJyYXkgdHlwZXMKK2luIEVNRjwvc3Bhbj48L2I+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnk7YmFja2dyb3VuZDpncmF5Jz4vKiBkb3QgbWVhbnMgcGFja2FnZSBuZXN0aW5nLAordGhlcmUgYXJlIG5vIGlubmVyIGNsYXNzZXMgaW4gRU1GICovPC9zcGFuPjwvYj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyInPiZuYnNwOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyInPiZuYnNwOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5saXN0PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gY2xhc3NNZW1iZXJEZWNscworOiBjbGFzc01lbWJlckRlY2wqIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+YWJzdHJhY3Q8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBjbGFzc01lbWJlckRlY2wKKzogKGFubm90YXRpb25zIG1vZGlmaWVycykgYXR0cmlidXRlIHwgcmVmZXJlbmNlIHwgb3BlcmF0aW9uIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBhdHRyaWJ1dGUgOiA8L3NwYW4+PGI+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDthdHRyJnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gdHlwZVdpdGhNdWx0aSBuYW1lPUlECisoRVFVQUxTIGRlZmF1bHRWYWx1ZUV4cHIpPyBTRU1JIDsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Iic+Jm5ic3A7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnNlcXVlbmNlPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gdHlwZVdpdGhNdWx0aSA6IG5hbWU9Ym91bmRFeGNlcHRXaWxkY2FyZAorKG11bHRpcGxpY2l0eSk/IDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBtdWx0aXBsaWNpdHkgOgorTFNRVUFSRSAobXVsdGlwbGljaXR5RXhwcik/IFJTUVVBUkUgOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5zZXF1ZW5jZTwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IG11bHRpcGxpY2l0eUV4cHIKKzogbG93ZXJCb3VuZD1zaW1wbGVNdWx0aXBsaWNpdHlFeHByIChET1RfRE9UIHVwcGVyQm91bmQ9c2ltcGxlTXVsdGlwbGljaXR5RXhwcik/Cis7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnRva2VuPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gc2ltcGxlTXVsdGlwbGljaXR5RXhwcgorOiBTVEFSIHwgUExVUyB8IFFNQVJLIHwgSU5UX0xJVEVSQUwgOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyInPiZuYnNwOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5zZXF1ZW5jZTwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IHJlZmVyZW5jZSA6IHJlZmVyZW5jZUtpbmQKK3R5cGVXaXRoTXVsdGkgKEhBU0ggb3Bwb3NpdGVOYW1lPUlEKT8gbmFtZT1JRCBTRU1JIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+dG9rZW48L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiByZWZlcmVuY2VLaW5kIDogPC9zcGFuPjxiPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eSc+JnF1b3Q7cmVmJnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gfCA8L3NwYW4+PGI+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDt2YWwmcXVvdDs8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiA7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Iic+Jm5ic3A7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPmxpc3Q8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBtb2RpZmllcnMgOiBvcHROZWdhdGVkTW9kaWZpZXIqCis7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnNlcXVlbmNlPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gb3B0TmVnYXRlZE1vZGlmaWVyCis6IChCQU5HKT8gbW9kaWZpZXIgOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz50b2tlbjwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IG1vZGlmaWVyPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5O2JhY2tncm91bmQ6Z3JheSc+Ly8ga2V5d29yZKCgoKCgoKAgRU1GIG1lYW5pbmc8L3NwYW4+PC9iPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+OiA8L3NwYW4+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eSc+JnF1b3Q7cmVhZG9ubHkmcXVvdDs8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPqCgIDwvc3Bhbj48Yj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnk7YmFja2dyb3VuZDpncmF5Jz4vLworRVN0cnVjdHVyYWxGZWF0dXJlLmNoYW5nZWFibGUgPSBmYWxzZTwvc3Bhbj48L2I+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz58IDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDt2b2xhdGlsZSZxdW90Ozwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+oKAgPC9zcGFuPjxiPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eTtiYWNrZ3JvdW5kOmdyYXknPi8vCitFU3RydWN0dXJhbEZlYXR1cmUudm9sYXRpbGWgoCA9IHRydWU8L3NwYW4+PC9iPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+fCA8L3NwYW4+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eSc+JnF1b3Q7dHJhbnNpZW50JnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz6gIDwvc3Bhbj48Yj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnk7YmFja2dyb3VuZDpncmF5Jz4vLworRVN0cnVjdHVyYWxGZWF0dXJlLnRyYW5zaWVudKAgPSB0cnVlPC9zcGFuPjwvYj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPnwgPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnknPiZxdW90O3Vuc2V0dGFibGUmcXVvdDs8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiA8L3NwYW4+PGI+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5O2JhY2tncm91bmQ6Z3JheSc+Ly8KK0VTdHJ1Y3R1cmFsRmVhdHVyZS51bnNldHRhYmxlID0gdHJ1ZTwvc3Bhbj48L2I+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz58IDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDtkZXJpdmVkJnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz6goKAgPC9zcGFuPjxiPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eTtiYWNrZ3JvdW5kOmdyYXknPi8vCitFU3RydWN0dXJhbEZlYXR1cmUuZGVyaXZlZKCgoCA9IHRydWU8L3NwYW4+PC9iPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+fCA8L3NwYW4+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eSc+JnF1b3Q7dW5pcXVlJnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz6goKCgIDwvc3Bhbj48Yj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnk7YmFja2dyb3VuZDpncmF5Jz4vLworKkVUeXBlZEVsZW1lbnQudW5pcXVloKCgoKCgoKAgPSB0cnVloCAtLSBiYWc/PC9zcGFuPjwvYj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPnwgPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnknPiZxdW90O29yZGVyZWQmcXVvdDs8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPqCgoCA8L3NwYW4+PGI+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5O2JhY2tncm91bmQ6Z3JheSc+Ly8KKypFVHlwZWRFbGVtZW50Lm9yZGVyZWSgoKCgoKCgID0gdHJ1ZaAgLS0gcmFuZG9tPzwvc3Bhbj48L2I+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz58IDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDtyZXNvbHZlJnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz6goCCgPC9zcGFuPjxiPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eTtiYWNrZ3JvdW5kOmdyYXknPi8vCisqRVJlZmVyZW5jZS5yZXNvbHZlUHJveGllc6CgoCA9IHRydWWgIC0tIGxvY2FsPzwvc3Bhbj48L2I+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz58IDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDtpZCZxdW90Ozwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+oKCgoKCgoKAgPC9zcGFuPjxiPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eTtiYWNrZ3JvdW5kOmdyYXknPi8vCitFQXR0cmlidXRlLmlkoKCgoKCgoKCgoKCgoKCgoCA9IHRydWU8L3NwYW4+PC9iPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+Ozwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyInPiZuYnNwOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5hYnN0cmFjdDwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IGRlZmF1bHRWYWx1ZUV4cHIKKzogYm9vbEV4cHIgfCBpbnRFeHByIHwgc3RyaW5nRXhwciB8IGNoYXJFeHByIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBib29sRXhwciA6IHRydWVPckZhbHNlCis7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnRva2VuPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gdHJ1ZU9yRmFsc2UgOiA8L3NwYW4+PGI+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDt0cnVlJnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gfCA8L3NwYW4+PGI+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDtmYWxzZSZxdW90Ozwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBpbnRFeHByIDoKKyhNSU5VUyk/IElOVF9MSVRFUkFMIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBzdHJpbmdFeHByIDoKK1NUUklOR19MSVRFUkFMIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBjaGFyRXhwciA6CitDSEFSX0xJVEVSQUwgOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyInPiZuYnNwOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5zZXF1ZW5jZTwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IG9wZXJhdGlvbiA6IDwvc3Bhbj48Yj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnknPiZxdW90O29wJnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gKHR5cGVQYXJhbXNJbmZvPXR5cGVQYXJhbXNJbmZvKT8KKzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPqCgIHJlc1R5cGU9cmVzdWx0VHlwZSBuYW1lPUlEIExQQVJFTiAocGFyYW1zKT8KK1JQQVJFTiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz6goCAoPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6Cis4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnknPiZxdW90O3Rocm93cyZxdW90Ozwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IGV4Y2VwdGlvbnM9Y29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkKT8KK1NFTUkgOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyInPiZuYnNwOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5hYnN0cmFjdDwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IHJlc3VsdFR5cGUgOiB0eXBlV2l0aE11bHRpCit8IHZvaWRDb250YWluZXIgOyA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiB2b2lkQ29udGFpbmVyIDogPC9zcGFuPjxiPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eSc+JnF1b3Q7dm9pZCZxdW90Ozwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IDsgPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Iic+Jm5ic3A7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPmxpc3Q8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBwYXJhbXMgOgorcDE9cGFyYW0gKENPTU1BIHBuPXBhcmFtKSo7IDwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5zZXF1ZW5jZTwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IHBhcmFtIDogbGVhZGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zCittb2RpZmllcnMgdHlwZVdpdGhNdWx0aSBuYW1lPUlEIHRyYWlsaW5nQW5ub3RhdGlvbnM9YW5ub3RhdGlvbnMgOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyInPiZuYnNwOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6bmF2eTtiYWNrZ3JvdW5kOmdyYXknPi8vICZxdW90O3RyYW5zaWVudCZxdW90OyBtZWFucworIXNlcmlhbGl6YWJsZTwvc3Bhbj48L2I+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOnJlZDtiYWNrZ3JvdW5kOnllbGxvdyc+c2VxdWVuY2U8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiBkYXRhVHlwZURlY2wgOiAodHJhbnNpZW50TW9kaWZpZXIpPworPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDtkYXRhdHlwZSZxdW90Ozwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IG5hbWU9SUQgQ09MT04gaW5zdENsYXNzTmFtZT1zdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRAorU0VNSSA7IDwvc3Bhbj48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Citjb2xvcjpuYXZ5O2JhY2tncm91bmQ6Z3JheSc+Ly8gVE9ETyBkYXRhdHlwZXMgc2hvdWxkIGFjY2VwdCB0eXBlIHBhcmFtZXRlcnM8L3NwYW4+PC9iPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnNlcXVlbmNlPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gdHJhbnNpZW50TW9kaWZpZXIKKzogPC9zcGFuPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDt0cmFuc2llbnQmcXVvdDs8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6YmxhY2snPiA7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Iic+Jm5ic3A7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnNlcXVlbmNlPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gZW51bURlY2wgOiA8L3NwYW4+PGI+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpuYXZ5Jz4mcXVvdDtlbnVtJnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gbmFtZT1JRCBMQ1VSTFkgZW51bUxpdGVyYWxzCitSQ1VSTFkgOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5saXN0PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gZW51bUxpdGVyYWxzIDogZW51bUxpdGVyYWwqCis7PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSd0ZXh0LWF1dG9zcGFjZTpub25lJz48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjguMHB0OworZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpyZWQ7YmFja2dyb3VuZDp5ZWxsb3cnPnNlcXVlbmNlPC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gZW51bUxpdGVyYWwgOiBsZWFkaW5nQW5ub3RhdGlvbnM9YW5ub3RhdGlvbnMKK25hbWU9SUQgKEVRVUFMUyB2YWw9SU5UX0xJVEVSQUwpPyB0cmFpbGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zIFNFTUkgOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyInPiZuYnNwOzwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ndGV4dC1hdXRvc3BhY2U6bm9uZSc+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDsKK2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Y29sb3I6cmVkO2JhY2tncm91bmQ6eWVsbG93Jz5zZXF1ZW5jZTwvc3Bhbj48L2I+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6OC4wcHQ7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijtjb2xvcjpibGFjayc+IG1hcEVudHJ5RGVjbCA6IDwvc3Bhbj48Yj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnknPiZxdW90O21hcGVudHJ5JnF1b3Q7PC9zcGFuPjwvYj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZTo4LjBwdDtmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOmJsYWNrJz4gbmFtZT1JRCBDT0xPTiBrZXk9dHlwZVdpdGhNdWx0aQorTUlOVVNfR1QgdmFsdWU9dHlwZVdpdGhNdWx0aSBTRU1JIDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciJz4mbmJzcDs8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3RleHQtYXV0b3NwYWNlOm5vbmUnPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6OC4wcHQ7Citmb250LWZhbWlseToiQ291cmllciBOZXciO2NvbG9yOm5hdnk7YmFja2dyb3VuZDpncmF5Jz4vLyB0aGUgZm9sbG93aW5nIHRva2VucyB3ZXJlCithZGRlZCB0byBjYXRlciBmb3IgZ2VuZXJpY3Mgc3ludGF4IDogQU1QLCBMVCwgR1Q8L3NwYW4+PC9iPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjguMHB0O2ZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyInPiA8L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1VUz4mbmJzcDs8L3NwYW4+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvaHRtbC9yZWZlcmVuY2UvTGFuZ3VhZ2VSZWYuaHRtbCBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL3JlZmVyZW5jZS9MYW5ndWFnZVJlZi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZDY3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvaHRtbC9yZWZlcmVuY2UvTGFuZ3VhZ2VSZWYuaHRtbApAQCAtMCwwICsxLDEzODcgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPGhlYWQ+CisgIDxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIgorIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSI+CisgIDx0aXRsZT5FbWZhdGljIExhbmd1YWdlIFJlZmVyZW5jZTwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5FbWZhdGljIExhbmd1YWdlIFJlZmVyZW5jZSZuYnNwOyAoZHJhZnQpPGJyPgorPC9oMT4KK2J5IENocmlzIERhbHkgKGNqZGFseUB1cy5pYm0uY29tKTxicj4KK0NvcHlyaWdodCBJQk0gQ29ycC4gMjAwNDxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5Ob3RlOiBFbWZhdGljLCBhcyBkZXNjcmliZWQgaGVyZSwgaXMKK2luIHN5bmMgd2l0aCBFbWZhdGljIHZlcnNpb24gMC4wLjEgYXZhaWxhYmxlIGZyb20gYWxwaGFXb3Jrczwvc3Bhbj4KKyhodHRwOi8vdzMuYWxwaGF3b3Jrcy5pYm0uY29tL3RlY2hzL292ZXJ2aWV3LmpzcD90ZWNoPWVtZmF0aWMpPGJyPgorPGJyPgorPGJyPgorPGhyIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAycHg7Ij48YnI+Cis8YnI+CitFbWZhdGljIGlzIGEgbGFuZ3VhZ2UgZGVzaWduZWQgdG8gcmVwcmVzZW50IEVNRiBFY29yZSBtb2RlbHMgaW4gYQordGV4dHVhbCBmb3JtLiZuYnNwOyBUaGlzIGRvY3VtZW50IGRldGFpbHMgdGhlIHN5bnRheCBvZiBFbWZhdGljIGFuZCB0aGUKK21hcHBpbmcgYmV0d2VlbiBFbWZhdGljIGRlY2xhcmF0aW9ucyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgRWNvcmUKK2NvbnN0cnVjdHMuPGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+UGxlYXNlIHNlZSB0aGUgPC9zcGFuPjxzcGFuCisgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FbWZhdGljIFNldHVwIEd1aWRlPC9zcGFuPjxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5hbmQ8L3NwYW4+PHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij4gdGhlIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5FbWZhdGljCitHPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyBmb250LXdlaWdodDogYm9sZDsiPmV0dGluZworU3RhcnRlZCBHdWlkZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij4gZm9yCitpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2V0LCBpbnN0YWxsIGFuZCB1c2UgRW1mYXRpYyBpbiB5b3VyIEVjbGlwc2UKK2Vudmlyb25tZW50Ljwvc3Bhbj48YnI+Cis8YnI+Cis8aDI+MS4gUGFja2FnZXM8L2gyPgorSW4gdGhpcyBkb2N1bWVudCwgRW1mYXRpYyBwcm9ncmFtcyBhcmUgc2hvd24gaW4gYm94ZXMKK2FzIGluIHRoZSBleGFtcGxlIGJlbG93Ojxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJ3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogbGVmdDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5wYWNrYWdlIHRlc3Q7PGJyPgorY2xhc3MgRm9vIHsgfTwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitXaGVuIGNvbXBpbGVkLCB0aGUgcHJvZ3JhbSBhYm92ZSB3aWxsIHByb2R1Y2UgYSBtb2RlbCB3aXRoIGFuIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RVBhY2thZ2U8L3NwYW4+IG5hbWVkICJ0ZXN0IiBjb250YWluaW5nIGEKK3NpbmdsZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FQ2xhc3M8L3NwYW4+IG5hbWVkICJGb28iLjxicj4KKzxicj4KK0FzIGlzIHByb2JhYmx5IGNsZWFyIGZyb20gdGhlIGZpcnN0IEVtZmF0aWMgcHJvZ3JhbSBhYm92ZSwgdGhlIGtleXdvcmQgPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnBhY2thZ2U8L3NwYW4+IGludHJvZHVjZXMgYW4gRWNvcmUgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FUGFja2FnZTwvc3Bhbj4gYW5kIHRoZSBpZGVudGlmaWVyCitmb2xsb3dpbmcgaXQgbWFwcyB0byB0aGUgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+bmFtZTwvc3Bhbj4KK2F0dHJpYnV0ZSBvZiB0aGUgZ2VuZXJhdGVkIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVQYWNrYWdlPC9zcGFuPi48YnI+Cis8aDM+MS4xIE1haW4gUGFja2FnZTwvaDM+CitUaGUgb25seSB0aGluZyByZXF1aXJlZCBpbiBhbiBFbWZhdGljIHNvdXJjZSBmaWxlIGlzIGEgcGFja2FnZQorZGVjbGFyYXRpb24uJm5ic3A7IFRoaXMgcmVxdWlyZWQgZWxlbWVudCBpcyBjYWxsZWQgdGhlIG1haW4gcGFja2FnZQorZGVjbGFyYXRpb24gYW5kIHRoZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FUGFja2FnZTwvc3Bhbj4KK2l0IGRlZmluZXMgd2lsbCBjb250YWluIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBhbGwgb2YgdGhlIG90aGVyCitlbGVtZW50cyBvZiB0aGUgZ2VuZXJhdGVkIEVjb3JlIG1vZGVsLiZuYnNwOyBUaHVzIHRoZSBzaW1wbGlzdCBwb3NzaWJsZQorRW1mYXRpYyBwcm9ncmFtIHdvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczo8YnI+Cis8YnI+Cis8dGFibGUKKyBzdHlsZT0id2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGxlZnQ7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiCisgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjIiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+cGFja2FnZSBwOzxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitTcGVjaWZ5aW5nIHZhbHVlcyBmb3IgdGhlIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVQYWNrYWdlPC9zcGFuPgorYXR0cmlidXRlcyA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5uc1VSSTwvc3Bhbj4gYW5kIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+bnNQcmVmaXg8L3NwYW4+IGlzIGRvbmUgbGlrZSB0aGlzOjxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5AbmFtZXNwYWNlKHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIsCitwcmVmaXg9ImVjb3JlIik8YnI+CitwYWNrYWdlIGVjb3JlOzxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitOb3RlIHRoYXQgRW1mYXRpYyBpcyBjYXNlLXNlbnNpdGl2ZSBpbiBtb3N0IGNvbnRleHRzIChyZWZsZWN0aW5nIHRoZQordW5kZXJseWluZyBjYXNlLXNlbnNpdGl2aXR5IG9mIEVjb3JlKSwgaG93ZXZlciB0aGUgaWRlbnRpZmllcnMgPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPm5hbWVzcGFjZTwvc3Bhbj4sIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij51cmk8L3NwYW4+IGFuZCA8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+cHJlZml4PC9zcGFuPiBpbiB0aGUgdGV4dCBhYm92ZSBjb3VsZAorYmUgd3JpdHRlbiBpbgorYW55IGNhc2UuJm5ic3A7IEFsc28gbm90ZSB0aGF0IHRoZSBvcmRlciBvZiBkZWNsYXJhdGlvbiBmb3IgPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnVyaTwvc3Bhbj4gYW5kIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5wcmVmaXg8L3NwYW4+IGlzIG5vdCBpbXBvcnRhbnQ8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+PC9zcGFuPi4mbmJzcDsgVGhlIHN5bnRheCBvZiB0aGUgPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkBuYW1lc3BhY2U8L3NwYW4+IGRlY2xhcmF0aW9uIGlzCithY3R1YWxseSBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgbW9yZSBnZW5lcmFsIHN5bnRheCBmb3IgZGVjbGFyaW5nCitFQW5ub3RhdGlvbnMsIHdoaWNoIHdpbGwgYmUgZGVzY3JpYmVkIGluIGZ1bGwgZGV0YWlsIGluIHNlY3Rpb24gNSBiZWxvdy48YnI+Cis8YnI+Cis8aDM+MS4yIFN1Yi1QYWNrYWdlczwvaDM+CitFY29yZSBhbGxvd3MgcGFja2FnZXMgdG8gYmUgbmVzdGVkIGluc2lkZSBwYWNrYWdlcy4mbmJzcDsgSW4gRW1mYXRpYywKK3RoZSBzeW50YXggZm9yIG5lc3RlZCBwYWNrYWdlcyBkaWZmZXJzIGZyb20gdGhhdCBvZiB0aGUgbWFpbgorcGFja2FnZS4mbmJzcDsgTmVzdGVkIHBhY2thZ2UgZGVjbGFyYXRpb25zIGFyZSBmb2xsb3dlZCBieSBhCitjdXJseS1icmFjZSBicmFja2V0ZWQgcmVnaW9uIHdoaWNoIGVuY2xvc2VzIHRoZSBuZXN0ZWQgcGFja2FnZQorY29udGVudHMuJm5ic3A7IFRoZSBleGFtcGxlIGJlbG93IGRlbW9uc3RyYXRlcyBwYWNrYWdlIG5lc3RpbmcuJm5ic3A7IDxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5wYWNrYWdlIG1haW47PGJyPgorICAgICAgPGJyPgorcGFja2FnZSBzdWIxIHs8YnI+Cit9PGJyPgorICAgICAgPGJyPgorcGFja2FnZSBzdWIyIHs8YnI+CismbmJzcDsgcGFja2FnZSBzdWIyXzEgeyB9PGJyPgorJm5ic3A7IHBhY2thZ2Ugc3ViMl8yIHsgfTxicj4KK308YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorPGJyPgorSW4gdGhlIEVjb3JlIG1vZGVsIGdlbmVyYXRlZCBmcm9tIHRoZSBhYm92ZSBwcm9ncmFtLCB0aGUgdG9wLWxldmVsCitwYWNrYWdlIG5hbWVkICJtYWluIiB3aWxsIGNvbnRhaW4gdHdvIHBhY2thZ2VzLCAic3ViMSIgYW5kICJzdWIyIiwgYW5kCitwYWNrYWdlIHN1YjIgd2lsbCBjb250YWluIHRoZSBwYWNrYWdlcyAic3ViMl8xIiBhbmQgInN1YjJfMiIuPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPjwvc3Bhbj48YnI+Cis8aDM+MS4zIE1haW4gUGFja2FnZSBJbXBvcnRzPC9oMz4KK0ltcG9ydCBzdGF0ZW1lbnRzIGFsbG93IGZvciB0eXBlcyBkZWZpbmVkIGluIGV4dGVybmFsIEVjb3JlIG1vZGVscyB0bworYmUgcmVmZXJlbmNlZC4mbmJzcDsgQWxsIGltcG9ydCBzdGF0ZW1lbnRzIG11c3QgaW1tZWRpYXRlbHkgZm9sbG93IHRoZQorbWFpbiBwYWNrYWdlIGRlY2xhcmF0aW9uLiZuYnNwOyBUaGUgZXhhbXBsZSBiZWxvdyBkZW1vbnN0cmF0ZXMgdGhlCitiYXNpYyBzeW50YXggb2YgaW1wb3J0IHN0YXRlbWVudHMuJm5ic3A7IFRoZSBkb3VibGUtcXVvdGVkIHN0cmluZworbGl0ZXJhbCBmb2xsb3dpbmcgdGhlIGltcG9ydCBrZXl3b3JkIG11c3QgY29udGFpbiB0aGUgVVJJIG9mIGFuIEVjb3JlCittb2RlbC48YnI+Cis8YnI+Cis8dGFibGUKKyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogbGVmdDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiCisgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjIiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+cGFja2FnZSBtYWluOzxicj4KKyAgICAgIDxicj4KK2ltcG9ydCAicGxhdGZvcm06L3Jlc291cmNlL3Byb2oxL2Zvby5lY29yZSI7PGJyPgoraW1wb3J0ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIjs8YnI+CisgICAgICA8YnI+CitwYWNrYWdlIHN1YiB7IH08YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorPGJyPgorTm90ZSB0aGF0IEVjb3JlLmVjb3JlIGlzIGF1dG9tYXRpY2FsbHkgaW1wb3J0ZWQsIHNvIHRoZSBzZWNvbmQgaW1wb3J0CitpbiB0aGUgcHJvZ3JhbSBhYm92ZSBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeS48YnI+Cis8YnI+Cis8aDI+Mi4gQ2xhc3NpZmllcnM8L2gyPgorPGgzPjIuMSBDbGFzc2VzPC9oMz4KK1RoZSBFbWZhdGljIHN5bnRheCBmb3IgY2xhc3MgZGVjbGFyYXRpb25zIGlzIHZlcnkgc2ltaWxhciB0byBKYXZhLAoraG93ZXZlciBhIGZldyBxdWlya3MgYXJlIHJlcXVpcmVkIHRvIGFsbG93IGZvciBhbGwgb2YgdGhlIHBvc3NpYmlsaXRpZXMKK29mIEVjb3JlLiZuYnNwOyBUaGUgZXhhbXBsZSBiZWxvdyBjb250YWluaW5nIGZvdXIgc2ltcGxlIGNsYXNzCitkZWNsYXJhdGlvbnMgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIGtleXdvcmRzIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5jbGFzczwvc3Bhbj4sIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5pbnRlcmZhY2U8L3NwYW4+IGFuZCA8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+YWJzdHJhY3Q8L3NwYW4+IGFuZCBhbHNvIGludHJvZHVjZXMKK0VtZmF0aWMgY29tbWVudHMgKEVtZmF0aWMgYWxsb3dzIGJvdGggc3R5bGVzIG9mIEphdmEgY29tbWVudHMpLiZuYnNwOworVGhlIGNvbW1lbnRzIGRldGFpbCB0aGUgbWFwcGluZyBmcm9tIEVtZmF0aWMgdG8gdGhlIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RUNsYXNzPC9zcGFuPiBhdHRyaWJ1dGVzIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+aW50ZXJmYWNlPC9zcGFuPiBhbmQgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5hYnN0cmFjdDwvc3Bhbj4uPGJyPgorPGJyPgorPHRhYmxlCisgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsgd2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGxlZnQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IgorIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIyIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnBhY2thZ2UgbWFpbjs8YnI+CisgICAgICA8YnI+CitjbGFzcyBDMSB7Cit9Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CisvLyBpc0ludGVyZmFjZT1mYWxzZSwgaXNBYnN0cmFjdD1mYWxzZTxicj4KK2Fic3RyYWN0IGNsYXNzIEMyIHsgfSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLworaXNJbnRlcmZhY2U9ZmFsc2UsIGlzQWJzdHJhY3Q9dHJ1ZTxicj4KK2ludGVyZmFjZSBJMSB7Cit9Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IC8vCitpc0ludGVyZmFjZT10cnVlLCZuYnNwOyBpc0Fic3RyYWN0PWZhbHNlPGJyPgorYWJzdHJhY3QgaW50ZXJmYWNlIEkyIHsgfSZuYnNwOyAvLyBpc0ludGVyZmFjZT10cnVlLCZuYnNwOworaXNBYnN0cmFjdD10cnVlPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KK0luaGVyaXRhbmNlIGlzIHNwZWNpZmllZCB3aXRoIHRoZSBrZXl3b3JkIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5leHRlbmRzPC9zcGFuPi4mbmJzcDsgVW5saWtlIEphdmEsCit0aGVyZSBpcyBubyA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmltcGxlbWVudHM8L3NwYW4+CitrZXl3b3JkIHRvIGRpc3Rpbmd1aXNoIGluaGVyaXRhbmNlIGZyb20gaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLiZuYnNwOworVGhlIGV4YW1wbGUgYmVsb3cgZGVmaW5lcyBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuPGJyPgorPGJyPgorPHRhYmxlCisgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsgd2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGxlZnQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IgorIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIyIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnBhY2thZ2UgbWFpbjs8YnI+CisgICAgICA8YnI+CitjbGFzcyBBIHsgfTxicj4KK2NsYXNzIEIgeyB9PGJyPgorY2xhc3MgQyBleHRlbmRzIEEsIEIgeyB9PGJyPgorY2xhc3MgRCBleHRlbmRzIEMgeyB9PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KK0lmIG5lY2Vzc2FyeSwgdGhlIHZhbHVlIG9mIHRoZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FQ2xhc3NpZmllcjwvc3Bhbj4KK2F0dHJpYnV0ZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbnN0YW5jZUNsYXNzTmFtZTwvc3Bhbj4KK2NhbiBiZSBzcGVjaWZpZWQuJm5ic3A7IFRoZSBjbGFzcyA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeTwvc3Bhbj4KK2Zyb20gRWNvcmUuZWNvcmUgcHJvdmlkZXMgYW4gZXhhbXBsZSBvZiB0aGlzOjxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5jbGFzcyBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSA6CitqYXZhLnV0aWwuTWFwJEVudHJ5IHs8YnI+CismbmJzcDsgLy8gLi4uIGNvbnRlbnRzIG9taXR0ZWQgLi4uPGJyPgorfTxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitOb3RlIHRoYXQgaWYgdGhlIGNsYXNzIGJvdGggZXh0ZW5kcyBvdGhlciBjbGFzc2VzIGFuZCBzcGVjaWZpZXMgYSB2YWx1ZQorZm9yIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPmluc3RhbmNlQ2xhc3NOYW1lPC9zcGFuPiwgdGhlIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5leHRlbmRzPC9zcGFuPiBjbGF1c2UgbXVzdCBwcmVjZWRlIHRoZQorPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+aW5zdGFuY2VDbGFzc05hbWU8L3NwYW4+IGNsYXVzZS48YnI+Cis8YnI+Cis8aDM+Mi4yIERhdGEgVHlwZXM8L2gzPgorRGVjbGFyaW5nIGFuIEVEYXRhVHlwZSBpcyBmYWlybHkgc2ltcGxlLiZuYnNwOyBIZXJlIGFyZSBzb21lIGZhbWlsaWFyCitleGFtcGxlcyBmcm9tIEVjb3JlLmVjb3JlOjxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5kYXRhdHlwZSBFSW50IDogaW50Ozxicj4KK2RhdGF0eXBlIEVJbnRlZ2VyT2JqZWN0IDogamF2YS5sYW5nLkludGVnZXI7PGJyPgordHJhbnNpZW50IGRhdGF0eXBlIEVKYXZhT2JqZWN0IDogamF2YS5sYW5nLk9iamVjdDs8YnI+CisgICAgICA8YnI+CitkYXRhdHlwZSBFRmVhdHVyZU1hcEVudHJ5IDogb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCRFbnRyeTs8YnI+CitkYXRhdHlwZSBFQnl0ZUFycmF5IDogImJ5dGVbXSI7Jm5ic3A7IC8vIE5vdGU6IFsgYW5kIF0gYXJlIG5vdCBsZWdhbAoraWRlbnRpZmllciBjaGFyYWN0ZXJzIGFuZCBtdXN0IGJlIGluIHF1b3Rlczxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitGaXJzdCBub3RlIHRoYXQgYXMgd2l0aCBjbGFzc2VzLCB0aGUgdmFsdWUgb2YgdGhlIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RUNsYXNzaWZpZXI8L3NwYW4+IGF0dHJpYnV0ZSA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPmluc3RhbmNlQ2xhc3NOYW1lPC9zcGFuPiBmb2xsb3dzIHRoZSBjb2xvbgorYWZ0ZXIgdGhlIG5hbWUgb2YgdGhlIGRhdGF0eXBlLiZuYnNwOyBIb3dldmVyIHNwZWNpZnlpbmcgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbnN0YW5jZUNsYXNzTmFtZTwvc3Bhbj4gaXMgcmVxdWlyZWQgZm9yCitkYXRhdHlwZXMgKHdoaWxlIGl0IGlzIG9wdGlvbmFsIGZvciBjbGFzc2VzKS48YnI+Cis8YnI+CitUaGUga2V5d29yZCA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnRyYW5zaWVudDwvc3Bhbj4gaW4KK3RoZSB0aGlyZCBkYXRhdHlwZSBkZWNsYXJhdGlvbiBhYm92ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RURhdGFUeXBlPC9zcGFuPiA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPnNlcmlhbGl6YWJsZTwvc3Bhbj4gYXR0cmlidXRlIHNob3VsZCBiZSBzZXQKK3RvIGZhbHNlLiZuYnNwOyBUaGlzIGlzIGEgZ29vZCB0aW1lIHRvIHBvaW50IG91dCB0aGF0IHRoZSBtb2RpZmllcgora2V5d29yZHMgaW50cm9kdWNlZCBzbyBmYXIgKDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+YWJzdHJhY3Q8L3NwYW4+CithbmQgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5pbnRlcmZhY2U8L3NwYW4+KSBhcmUKK2FwcGxpZWQgdG8gcmV2ZXJzZSB0aGUgZGVmYXVsdCBFY29yZSBhdHRyaWJ1dGUgdmFsdWVzIChieSBkZWZhdWx0IDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RUNsYXNzPC9zcGFuPiBhdHRyaWJ1dGVzIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+YWJzdHJhY3Q8L3NwYW4+IGFuZCA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPmludGVyZmFjZTwvc3Bhbj4gYXJlIGJvdGggZmFsc2UpLiZuYnNwOyBJbgordGhlIGNhc2Ugb2YgdGhlIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVEYXRhVHlwZTwvc3Bhbj4KK2F0dHJpYnV0ZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5zZXJpYWxpemFibGU8L3NwYW4+LCB0aGUKK2RlZmF1bHQgdmFsdWUgaXMgdHJ1ZSBzbyBFbWZhdGljIHVzZXMgYSBrZXl3b3JkLCA8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+dHJhbnNpZW50PC9zcGFuPiwgdGhhdCBtZWFucyB0aGUKK29wcG9zaXRlIG9mIHNlcmlhbGl6YWJsZS48YnI+Cis8YnI+CitUaGUgbGFzdCB0d28gZGF0YXR5cGVzIGlsbHVzdHJhdGUgYSBzdWJ0bGUgc3ludGFjdGljIHBvaW50LiZuYnNwOyBUaGUKK3ZhbHVlIHNwZWNpZmllZCBmb3IgdGhlIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPmluc3RhbmNlQ2xhc3NOYW1lPC9zcGFuPgorYXR0cmlidXRlIG11c3QgZWl0aGVyIGJlIGEgdmFsaWQgcXVhbGlmaWVkIGlkZW50aWZpZXIgKGEgZG90IG9yCitkb2xsYXItc2lnbiBzZXBhcmF0ZWQgbGlzdCBvZiBpZGVudGlmaWVycyBzdWNoIGFzIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5qYXZhLmxhbmcuT2JqZWN0PC9zcGFuPiBpbiB0aGUgdGhpcmQKK2RhdGF0eXBlIGFib3ZlKSBvciBpdCBtdXN0IGJlIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMuJm5ic3A7IFRoZQorZGF0YXR5cGUgRUZlYXR1cmVNYXBFbnRyeSBjb250YWlucyB0aGUgY2hhcmFjdGVyICc8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+JDwvc3Bhbj4nIHdoaWNoLCBmb2xsb3dpbmcgSmF2YQorc3ludGFjdGljIHJ1bGVzLCBpcyBhIGxlZ2FsIHF1YWxpZmllZCBpZGVudGlmaWVyIHNlcGFyYXRvci4mbmJzcDsgVGhlCitkYXRhdHlwZSBFQnl0ZUFycmF5IGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXJzICc8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+Wzwvc3Bhbj4nIGFuZCAnPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPl08L3NwYW4+JyB3aGljaCBhcmUgbm90IGxlZ2FsIGluIGEKK3F1YWxpZmllZCBpZGVudGlmaWVyLjxicj4KKzxicj4KK1RoZSBvdmVyYWxsIHBvaW50IHRvIG1ha2UgYWJvdXQgcXVhbGlmaWVkIGlkZW50aWZpZXIgdmVyc3VzCitkb3VibGUtcXVvdGVkIHN5bnRheCBmb3IgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+aW5zdGFuY2VDbGFzc05hbWU8L3NwYW4+CitpcyB0aGF0IHRoZSB0eXBpY2FsIGRhdGF0eXBlIGRlY2xhcmF0aW9uIGNhbiB1c2UgdGhlIGZvcm1lciBhbmQgdGh1cworc2hvdWxkIGJlIGVhc2llciB0byByZWFkIGFuZCBlZGl0LCB3aGlsZSB0aGUgbGF0dGVyIGlzIGF2YWlsYWJsZSB3aGVuCituZWVkZWQgYW5kIGFsbG93cyBmb3IgYXJiaXRyYXJ5IHN0cmluZyB0ZXh0IHRvIGJlIHBsYWNlZCBpbiB0aGUKK2dlbmVyYXRlZCBFY29yZSBtb2RlbC4mbmJzcDsgVGhlcmUgYXJlIHNvbWUgb3RoZXIgY29udGV4dHMgd2hlcmUgdGhlCitFbWZhdGljIHByb2dyYW1tYXIgaGFzIHRoZSBvcHRpb24gdG8gdXNlIGVpdGhlciBhIHF1YWxpZmllZCBpZGVudGlmaWVyCitvciBkb3VibGUtcXVvdGVkIHN0cmluZyAoc2VlIHRoZSBzZWN0aW9uIG9uIEFubm90YXRpb25zIGJlbG93IGZvcgorYW5vdGhlciBleGFtcGxlIG9mIHRoaXMpLjxicj4KKzxicj4KKzxoMz4yLjMgRW51bWVyYXRlZCBUeXBlczwvaDM+CitUaGUgZXhhbXBsZSBiZWxvdyBkZW1vbnN0cmF0ZXMgdGhlIEVtZmF0aWMgc3ludGF4IHRoYXQgbWFwcyB0byA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVFbnVtPC9zcGFuPiBhbmQgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FRW51bUxpdGVyYWw8L3NwYW4+LiZuYnNwOyBOb3RlIHRoYXQgdGhlCitzaW1wbGUgYXNzaWdubWVudCBleHByZXNzaW9ucyBzcGVjaWZ5IHRoZSA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPnZhbHVlPC9zcGFuPiBhdHRyaWJ1dGUgb2YgZWFjaCBnZW5lcmF0ZWQgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FRW51bUxpdGVyYWw8L3NwYW4+Ljxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5lbnVtIEUgezxicj4KKyZuYnNwOyBBPTE7PGJyPgorJm5ic3A7IEI9Mjs8YnI+CismbmJzcDsgQz0zOzxicj4KK308YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorPGJyPgorSW4gZmFjdCwgc3BlY2lmeWluZyBlbnVtZXJhdGlvbiBsaXRlcmFsIHZhbHVlcyBpcyBvcHRpb25hbCBhbmQKK0VtZmF0aWMgZ2VuZXJhdGVzIHJlYXNvbmFibGUgdmFsdWVzIHdoZW4gdGhleSBhcmUgbGVmdAordW5zcGVjaWZpZWQuJm5ic3A7IFRoZSBjb2RlIGFuZCBjb21tZW50cyBiZWxvdyBkZXNjcmliZSB0aGUgcnVsZXMgZm9yCit0aGlzLjxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5lbnVtIEUgezxicj4KKyZuYnNwOyBBOyZuYnNwOyAvLyA9IDAgKGlmIG5vdCBzcGVjaWZpZWQsIGZpcnN0IGxpdGVyYWwgaGFzIHZhbHVlIDApPGJyPgorJm5ic3A7IEIgPSAzOzxicj4KKyZuYnNwOyBDOyZuYnNwOyAvLyA9IDQgKGluIGdlbmVyYWwsIHVuc3BlY2lmaWVkIHZhbHVlcyBhcmUgMSBncmVhdGVyCit0aGFuIHByZXZpb3VzIHZhbHVlKTxicj4KKyZuYnNwOyBEOyZuYnNwOyAvLyA9IDU8YnI+Cit9PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KKzxoMz4yLjQgTWFwIEVudHJpZXM8L2gzPgorTWFwRW50cnkgY2xhc3NlcyAoc3VjaCBhcyA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeTwvc3Bhbj4KK2luIEVjb3JlLmVjb3JlKSBjYW4gYmUgc3BlY2lmaWVkIGluIGVpdGhlciBvZiB0d28gd2F5cy4mbmJzcDsgVGhlCisibG9uZ2hhbmQiIHdheSBpcyB0byBkZWNsYXJlIGEgY2xhc3Mgd2l0aCBmZWF0dXJlcyBuYW1lZCA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPmtleTwvc3Bhbj4gYW5kIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+dmFsdWU8L3NwYW4+IGFuZCB3aXRoIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5baW5zdGFuY2VDbGFzcz1qYXZhLnV0aWwuTWFwJEVudHJ5XTwvc3Bhbj4KK2FzIHN1Z2dlc3RlZCBhdCB0aGUgZW5kIG9mIHNlY3Rpb24gMi4xIGFib3ZlLiZuYnNwOyBCdXQgdGhlcmUgaXMgYQorY29udmllbmVudCBzaG9ydGhhbmQgbm90YXRpb24gd2hpY2ggYWNoaWV2ZXMgdGhlIHNhbWUgcmVzdWx0Ojxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5tYXBlbnRyeSBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeQorOiBTdHJpbmcgLSZndDsgU3RyaW5nOzxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitUaGUgZXhwcmVzc2lvbiBmb2xsb3dpbmcgdGhlIGNvbG9uIGdpdmVzIHRoZSB0eXBlIG9mIHRoZSBNYXBFbnRyeSA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPmtleTwvc3Bhbj4gc3RydWN0dXJhbCBmZWF0dXJlIGZvbGxvd2VkIGJ5Cit0aGUgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4tJmd0Ozwvc3Bhbj4KK29wZXJhdG9yLCBmb2xsb3dlZCBieSB0aGUgdHlwZSBvZiB0aGUgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+dmFsdWU8L3NwYW4+CitzdHJ1Y3R1cmFsIGZlYXR1cmUuJm5ic3A7IFR5cGUgZXhwcmVzc2lvbnMgY2FuCitiZSBtb3JlIGNvbXBsZXggdGhhbiBzaG93biBpbiB0aGUgZXhhbXBsZSBhYm92ZSBhbmQgYXJlIGRldGFpbGVkIGZ1bGx5CitpbiB0aGUgbmV4dCBzZWN0aW9uLjxicj4KKzxicj4KKzxoMj4zLiBUeXBlIEV4cHJlc3Npb25zPGJyPgorPC9oMj4KK1RoZSBtb3N0IGJhc2ljIEVjb3JlIGVsZW1lbnRzIHRoYXQgaGF2ZW4ndCB5ZXQgYmVlbiBleHBsb3JlZCBpbiBFbWZhdGljCithcmUgdGhlIHN0cnVjdHVyYWwgYW5kIGJlaGF2aW9yYWwgY2xhc3MgZmVhdHVyZXMgcmVwcmVzZW50ZWQgYnkgdGhlCitFY29yZSBjbGFzc2VzIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVBdHRyaWJ1dGU8L3NwYW4+LAorPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RVJlZmVyZW5jZTwvc3Bhbj4sIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RU9wZXJhdGlvbjwvc3Bhbj4gYW5kIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RVBhcmFtZXRlcjwvc3Bhbj4uJm5ic3A7IFRoZXNlIGZvdXIgRWNvcmUKK2NsYXNzZXMgYXJlIGFsbCBkZXJpdmVkIGZyb20gPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RVR5cGVkRWxlbWVudDwvc3Bhbj4KK3doaWNoIG1lYW5zIHRoYXQgaW5zdGFuY2VzIG9mIHRoZW0gaGF2ZSBzb21lIHR5cGUgKHdoaWNoIGlzIGFuIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RUNsYXNzaWZpZXI8L3NwYW4+KSBhbmQgaW5oZXJpdCB0aGUgb3RoZXIKK2NoYXJhY3RlcmlzdGljcyBvZiA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FVHlwZWRFbGVtZW50PC9zcGFuPiwKK2xpa2UgbXVsdGlwbGljaXR5LiZuYnNwOyBCZWZvcmUgd2UgY2FuIGRlc2NyaWJlIGVhY2ggc3BlY2lmaWMga2luZCBvZgorY2xhc3MgZmVhdHVyZSwgd2UgbmVlZCB0byBzaG93Citob3cgdHlwZXMgYXJlIHJlcHJlc2VudGVkIHN5bnRhY3RpY2FsbHksIGJlY2F1c2UgdGhhdCBhcHBsaWVzIChtb3JlIG9yCitsZXNzKSB0byBhbGwgb2YgdGhlbS48YnI+Cis8YnI+CitUeXBlIGV4cHJlc3Npb25zIGhhdmUgdHdvIHBhcnRzLiZuYnNwOyBGaXJzdCBpcyBhIHNpbXBsZSBpZGVudGlmaWVyIG9yCithIHF1YWxpZmllZCBpZGVudGlmaWVyIChhIGRvdC1zZXBhcmF0ZWQgbGlzdCBvZiBzaW1wbGUgaWRlbnRpZmllcnMgbGlrZQorImEuYi5jIikgdGhhdCBpZGVudGlmaWVzIHNvbWUgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RUNsYXNzaWZpZXI8L3NwYW4+LiZuYnNwOworVGhlIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVDbGFzc2lmaWVyPC9zcGFuPgoraWRlbnRpZmllZCBtYXkgYmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBFbWZhdGljIHNvdXJjZSBmaWxlIGFzIHRoZSB0eXBlCitleHByZXNzaW9uLCBvciBpdCBtYXkgYmUgaW4gb25lIG9mIHRoZSBpbXBvcnRlZCBFY29yZSBtb2RlbHMgKHNwZWNpZmllZAoraW4gaW1wb3J0IHN0YXRlbWVudHMpLjxicj4KKzxicj4KK0xldCdzIHNraXAgYWhlYWQgYSBsaXR0bGUgYnkgbG9va2luZyBhdCBzb21lIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgc28KK3RoYXQgd2UgY2FuIHRhbGsgYWJvdXQgdGhlaXIgdHlwZSBleHByZXNzaW9uczo8YnI+Cis8YnI+Cis8dGFibGUKKyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogbGVmdDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiCisgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjIiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+cGFja2FnZSB0ZXN0Ozxicj4KKyAgICAgIDxicj4KK2RhdGF0eXBlIEQxIDogaW50Ozxicj4KKyAgICAgIDxicj4KK3BhY2thZ2UgUCB7PGJyPgorJm5ic3A7IGRhdGF0eXBlIEQyIDogaW50Ozxicj4KK308YnI+CisgICAgICA8YnI+CitjbGFzcyBDIHs8YnI+CismbmJzcDsgYXR0ciBEMSBkMTs8YnI+CismbmJzcDsgYXR0ciBQLkQyIGQyOzxicj4KKyZuYnNwOyBhdHRyIGVjb3JlLkVTdHJpbmcgczE7PGJyPgorJm5ic3A7IGF0dHIgU3RyaW5nIHMyOzxicj4KK308YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorPGJyPgorVGhlIGNsYXNzIG5hbWVkICJDIiBhYm92ZSBkZWNsYXJlcyBmb3VyIGF0dHJpYnV0ZXMgd2l0aCB0aGUgbmFtZXMgImQxIiwKKyJkMiIsICJzMSIgYW5kICJzMiIuJm5ic3A7IE5vdGUgdGhhdCBFbWZhdGljIGZvbGxvd3MgSmF2YSBzeW50YWN0aWMKK3N0eWxlIGluIHBsYWNpbmcgdHlwZSBleHByZXNzaW9uIGJlZm9yZSB0aGUgbmFtZS4mbmJzcDsgSG93ZXZlciB1bmxpa2UKK0phdmEgZmllbGQgZGVjbGFyYXRpb25zLCBFbWZhdGljIHVzZXMgYSBrZXl3b3JkIC0gPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmF0dHI8L3NwYW4+IC0gdG8gaW50cm9kdWNlIGFuCithdHRyaWJ1dGUuJm5ic3A7IChUaGUga2V5d29yZCA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmF0dHI8L3NwYW4+CithbmQgc2ltaWxhciBrZXl3b3JkcyB0byBpbnRyb2R1Y2UgcmVmZXJlbmNlcyBhbmQgb3BlcmF0aW9ucyB3aWxsCitleHBsYWluZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIGZvbGxvd2luZyBzdWItc2VjdGlvbnMpLjxicj4KKzxicj4KK1RoZSB0eXBlIGV4cHJlc3Npb24gZm9yIGQxIGlzICJEMSIgd2hpY2ggaWRlbnRpZmllcyB0aGUgZGF0YXR5cGUKK0QxLiZuYnNwOyBCZWNhdXNlIEMgYW5kIEQxIGFyZSBpbiB0aGUgc2FtZSBwYWNrYWdlICh0ZXN0KSwgdGhpcyBzaW1wbGUKK2V4cHJlc3Npb24gaXMgZmluZS48YnI+Cis8YnI+CitUaGUgdHlwZSBleHByZXNzaW9uIGZvciBkMiBpcyAiUC5EMiIuJm5ic3A7IEluIHRoaXMgY2FzZSBhIHF1YWxpZmllZAoraWRlbnRpZmllciBleHByZXNzaW9uIGlzIG5lY2Vzc2FyeSB0byBpZGVudGlmeSBkYXRhdHlwZSBEMiBpbnNpZGUKK3BhY2thZ2UgUC48YnI+Cis8YnI+CitUaGUgdHlwZSBleHByZXNzaW9uIGZvciBzMSBpcyAiZWNvcmUuRVN0cmluZyIuJm5ic3A7IFRoaXMgaWRlbnRpZmllcwordGhlIGRhdGF0eXBlIEVTdHJpbmcgaW4gcGFja2FnZSBlY29yZSAocmVjYWxsIHRoYXQgbW9kZWwgRWNvcmUuZWNvcmUgaXMKK2ltcGxpY2l0bHkgaW1wb3J0ZWQgaW4gYWxsIEVtZmF0aWMgcHJvZ3JhbXMpLjxicj4KKzxicj4KK1RoZSB0eXBlIGV4cHJlc3Npb24gZm9yIHMyIGlzICJTdHJpbmciLiZuYnNwOyBUaGUgaWRlbnRpZmllciBTdHJpbmcgaXMKK2FjdHVhbGx5IGEgc3BlY2lhbCBzaG9ydGhhbmQgZm9yIGVjb3JlLkVTdHJpbmcsIHNvIHMxIGFuZCBzMiBoYXZlIHRoZQorc2FtZSB0eXBlLjxicj4KKzxoMz4zLjEgQmFzaWMgVHlwZXM8L2gzPgorQSBudW1iZXIgb2YgdGhlIHR5cGVzIGRlZmluZWQgaW4gRWNvcmUuZWNvcmUgaGF2ZSBzaG9ydGhhbmQgbm90YXRpb24gaW4KK0VtZmF0aWMuJm5ic3A7IFRoZSB0YWJsZSBiZWxvdyBsaXN0cyB0aGUgRW1mYXRpYyBzaG9ydGhhbmQgYW5kIHRoZQorY29ycmVzcG9uZGluZyBFY29yZS5lY29yZSB0eXBlIG5hbWUgZm9yIGVhY2ggb2YgdGhlc2UgYmFzaWMgdHlwZXMgYXMKK3dlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSB0eXBlIG9yIGNsYXNzICh0YWtlbiBmcm9tIHRhYmxlIDUuMSBpbgordGhlIEVNRiBib29rKS48YnI+Cis8YnI+Cis8dGFibGUgc3R5bGU9IndpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIKKyBjZWxsc3BhY2luZz0iMiI+CisgIDxjYXB0aW9uPlRhYmxlIDMuMSAtIEJhc2ljIFR5cGUgTmFtZXM8YnI+CisgIDwvY2FwdGlvbj4gPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDIwNCk7Ij5FbWZhdGljCitLZXl3b3JkPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDIwNCk7Ij5FY29yZQorRUNsYXNzaWZpZXIgbmFtZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyMDQpOyI+SmF2YQordHlwZSBuYW1lPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij5ib29sZWFuPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVCb29sZWFuPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPmJvb2xlYW48YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsiPkJvb2xlYW48YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+RUJvb2xlYW5PYmplY3Q8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+amF2YS5sYW5nLkJvb2xlYW48YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsiPmJ5dGU8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+RUJ5dGU8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+Ynl0ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyI+Qnl0ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5FQnl0ZU9iamVjdDxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5qYXZhLmxhbmcuQnl0ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyI+Y2hhcjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5FQ2hhcjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5jaGFyPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij5DaGFyYWN0ZXI8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+RUNoYXJhY3Rlck9iamVjdDxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5qYXZhLmxhbmcuQ2hhcmFjdGVyPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij5kb3VibGU8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+RURvdWJsZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5kb3VibGU8YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsiPkRvdWJsZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5FRG91YmxlT2JqZWN0PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPmphdmEubGFuZy5Eb3VibGU8YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsiPmZsb2F0PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVGbG9hdDxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5mbG9hdDxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyI+RmxvYXQ8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+RUZsb2F0T2JqZWN0PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPmphdmEubGFuZy5GbG9hdDxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyI+aW50PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVJbnQ8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+aW50PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij5JbnRlZ2VyPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVJbnRlZ2VyT2JqZWN0PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPmphdmEubGFuZy5JbnRlZ2VyPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij5sb25nPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVMb25nPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPmxvbmc8YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsiPkxvbmc8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+RUxvbmdPYmplY3Q8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+amF2YS5sYW5nLkxvbmc8YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsiPnNob3J0PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVTaG9ydDxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5zaG9ydDxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyI+U2hvcnQ8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+RVNob3J0T2JqZWN0PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPmphdmEubGFuZy5TaG9ydDxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyI+RGF0ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5FRGF0ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5qYXZhLnV0aWwuRGF0ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyI+U3RyaW5nPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVTdHJpbmc8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+amF2YS5sYW5nLlN0cmluZzxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyI+T2JqZWN0PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVKYXZhT2JqZWN0PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPmphdmEubGFuZy5PYmplY3Q8YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsiPkNsYXNzPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVKYXZhQ2xhc3M8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+amF2YS5sYW5nLkNsYXNzPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij5FT2JqZWN0PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVPYmplY3Q8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsiPkVDbGFzczxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5FQ2xhc3M8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitSZW1lbWJlciB0aGF0IHlvdSBjYW4gYWx3YXlzIHJlZmVyZW5jZSB0aGVzZSB0eXBlcywgYW5kIHRoZSByZXN0IG9mIHRoZQordHlwZXMgaW4gRWNvcmUuZWNvcmUsIGJ5IHVzaW5nIHRoZWlyIGZ1bGx5IHF1YWxpZmllZCBuYW1lIHdoaWNoIGJlZ2lucword2l0aCB0aGUgcGFja2FnZSBwcmVmaXggImVjb3JlIi4mbmJzcDsgRm9yIGV4YW1wbGUgPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmVjb3JlLkVPcGVyYXRpb248L3NwYW4+IGFuZCA8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+ZWNvcmUuRUJpZ0ludGVnZXI8L3NwYW4+IGFyZSBhbHNvCitsZWdhbCByZWZlcmVuY2VzIHRvIHR5cGVzIGluIEVjb3JlLmVjb3JlLjxicj4KKzxicj4KKzxoMz4zLjIgTXVsdGlwbGljaXR5IEV4cHJlc3Npb25zIDwvaDM+CitUaGUgc2Vjb25kIHBhcnQgb2YgYSB0eXBlIGV4cHJlc3Npb24gaXMgdGhlIG11bHRpcGxpY2l0eQorZXhwcmVzc2lvbi4mbmJzcDsgVGhpcyBtYXBzIHRvIHRoZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sb3dlckJvdW5kPC9zcGFuPgorYW5kIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPnVwcGVyQm91bmQ8L3NwYW4+IGF0dHJpYnV0ZXMgb2YgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FVHlwZWRFbGVtZW50PC9zcGFuPi4mbmJzcDsgTXVsdGlwbGljaXR5CitleHByZXNzaW9ucyBhcmUgb3B0aW9uYWwsIGJ1dCB3aGVuIG9taXR0ZWQgdGhlIGdlbmVyYXRlZCA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVUeXBlZEVsZW1lbnQ8L3NwYW4+IGdldHMgdGhlIGRlZmF1bHRzICg8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPmxvd2VyQm91bmQ8L3NwYW4+ID0gMCBhbmQgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij51cHBlckJvdW5kPC9zcGFuPiA9IDEpLiZuYnNwOyBUaGUgZXhhbXBsZQorYmVsb3cgc2hvd3Mgc29tZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zIHdpdGggbXVsdGlwbGljaXR5IGV4cHJlc3Npb25zOjxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5jbGFzcyBDIHs8YnI+CismbmJzcDsgYXR0ciBTdHJpbmdbMV0gczE7PGJyPgorJm5ic3A7IGF0dHIgU3RyaW5nWzAuLjNdIHMyOzxicj4KKyZuYnNwOyBhdHRyIFN0cmluZ1sqXSBzMzs8YnI+CismbmJzcDsgYXR0ciBTdHJpbmdbK10gczQ7PGJyPgorfTxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitUaGUgbWFwcGluZyBiZXR3ZWVuIHZhcmlvdXMgbXVsdGlwbGljaXR5IGV4cHJlc3Npb25zIGFuZCB0aGUgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sb3dlckJvdW5kPC9zcGFuPiBhbmQgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij51cHBlckJvdW5kPC9zcGFuPiBhdHRyaWJ1dGVzIG9mIHRoZQorZ2VuZXJhdGVkIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVUeXBlZEVsZW1lbnQ8L3NwYW4+IGlzCitkZXRhaWxlZCBtb3JlIGZ1bGx5IGluIHRoZSBmb2xsb3dpbmcgdGFibGUuPGJyPgorPGJyPgorPHRhYmxlIHN0eWxlPSJ3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogbGVmdDsiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiCisgY2VsbHNwYWNpbmc9IjIiPgorICA8Y2FwdGlvbj5UYWJsZSAzLjIgLSBNdWx0aXBsaWNpdHkgRXhwcmVzc2lvbnM8YnI+CisgIDwvY2FwdGlvbj4gPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyMDQpOyI+RW1mYXRpYworbXVsdGlwbGljaXR5IGV4cHJlc3Npb248YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjA0KTsiPkVUeXBlZEVsZW1lbnQKK2xvd2VyQm91bmQ8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjA0KTsiPkVUeXBlZEVsZW1lbnQKK3VwcGVyQm91bmQ8YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsiPjxzcGFuCisgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPm5vbmU8L3NwYW4+PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPjA8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+MTxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyI+PHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPls/XTwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+MDxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij4xPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHZlcnRpY2FsLWFsaWduOiB0b3A7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5bXTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij4wPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnVuYm91bmRlZCAoLTEpPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij48c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+WypdPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij4wPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnVuYm91bmRlZCAoLTEpPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij48c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+WytdPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij4xPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnVuYm91bmRlZCAoLTEpPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij48c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+WzFdPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij4xPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPjE8YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsiPjxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5bPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPm48L3NwYW4+XTwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPm48L3NwYW4+PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPjxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5uPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyI+PHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPlswLi40XTwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+MDxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij40PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij48c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+WzxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5tPC9zcGFuPi4uPHNwYW4KKyBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+bjwvc3Bhbj5dPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+bTwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPm48L3NwYW4+PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij48c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+WzUuLipdPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij41PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnVuYm91bmRlZCAoLTEpPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij48c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+WzEuLj9dPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij4xPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnVuc3BlY2lmaWVkICgtMik8YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorPGJyPgorPGJyPgorPGgzPjMuMyBFc2NhcGluZyBLZXl3b3JkczwvaDM+Cis8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+Tm90ZTogdGhpcyBkb2Vzbid0IHJlYWxseSBmaXQgaGVyZSwKK2J1dCBJIGNhbid0IGZpbmQgYSBiZXR0ZXIgcGxhY2UgZm9yIGl0Li4uPC9zcGFuPjxicj4KKzxicj4KK1NvbWV0aW1lcyBpdCdzIG5lY2Vzc2FyeSBvciBkZXNpcmFibGUgdG8gdXNlIGEga2V5d29yZCBhcyB0aGUgbmFtZSBmb3IKK3NvbWUgbW9kZWwgZWxlbWVudC4mbmJzcDsgVGhpcyBjYW4gYmUgYWNoZWl2ZWQgYnkgcHJlZml4aW5nIHRoZSBuYW1lCitpZGVudGlmaWVyIHdpdGggdGhlICc8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPn48L3NwYW4+Jworc3ltYm9sLiZuYnNwOyBUaGlzIGFiaWxpdHkgd2FzIGFkZGVkIHByaW1hcmlseSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvCityZXByZXNlbnQgRWNvcmUuZWNvcmUgaW4gRW1mYXRpYywgc28gd2UnbGwgc2hvdyBhbm90aGVyIGV4YW1wbGUgZnJvbQorRWNvcmUuZWNvcmUgaGVyZSB0byBpbGx1c3RyYXRlOjxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5jbGFzcyBFQ2xhc3MgZXh0ZW5kcyBFQ2xhc3NpZmllcgorezxicj4KKyZuYnNwOyAvLyAuLi48YnI+CismbmJzcDsgfmFic3RyYWN0IDogRUJvb2xlYW47PGJyPgorJm5ic3A7IH5pbnRlcmZhY2UgOiBFQm9vbGVhbjs8YnI+CismbmJzcDsgLy8gLi4uPGJyPgorfTxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitSZWNhbGwgdGhhdCB0aGUgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5hYnN0cmFjdDwvc3Bhbj4KK2FuZCA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmludGVyZmFjZTwvc3Bhbj4ga2V5d29yZHMKK2FyZSB1c2VkIGluIGNsYXNzIGRlY2xhcmF0aW9ucy4mbmJzcDsgVGhlIGNvZGUgYWJvdmUgc2hvd3MgaG93IHRoZXkgY2FuCitiZSB1c2VkIGFzIGF0dHJpYnV0ZSBuYW1lcy4mbmJzcDsgRW1mYXRpYyByZW1vdmVzIHRoZSAnPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPn48L3NwYW4+JyBzeW1ib2wgc28gbmFtZXMgaW4gdGhlCitnZW5lcmF0ZWQgRWNvcmUgbW9kZWwgZG8gbm90IGNvbnRhaW4gaXQuPGJyPgorPGJyPgorPGgyPjQuIFN0cnVjdHVyYWwgYW5kIEJlaGF2aW9yYWwgRmVhdHVyZXM8L2gyPgorTm93IHdlIGFyZSByZWFkeSB0byBzaG93IGhvdyB0aGUgRWNvcmUgY2xhc3MgZmVhdHVyZXMgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FQXR0cmlidXRlPC9zcGFuPiwKKzxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVSZWZlcmVuY2U8L3NwYW4+LCA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVPcGVyYXRpb248L3NwYW4+IGFuZCA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVQYXJhbWV0ZXI8L3NwYW4+IGFyZSByZXByZXNlbnRlZCBpbgorRW1mYXRpYy4mbmJzcDsgVGhlIGV4YW1wbGUgYmVsb3cgaXMgdGhlIGNsYXNzIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RVBhY2thZ2U8L3NwYW4+Citmcm9tIEVjb3JlLmVjb3JlIGFuZCBpdCB3YXMKK2Nob3NlbiB0byBnaXZlIGEgZmVlbCBmb3IgdGhlIGZlYXR1cmUgc3ludGF4IGJlY2F1c2UgaXQgY29udGFpbnMgYQorc2FtcGxlIG9mIGVhY2gga2luZCBvZiBjbGFzcyBmZWF0dXJlLiZuYnNwOyA8YnI+Cis8YnI+Cis8dGFibGUKKyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogbGVmdDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiCisgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjIiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+Y2xhc3MgRVBhY2thZ2UgZXh0ZW5kcworRU5hbWVkRWxlbWVudCB7PGJyPgorJm5ic3A7IG9wIEVDbGFzc2lmaWVyIGdldEVDbGFzc2lmaWVyKEVTdHJpbmcgbmFtZSk7PGJyPgorJm5ic3A7IGF0dHIgRVN0cmluZyBuc1VSSTs8YnI+CismbmJzcDsgYXR0ciBFU3RyaW5nIG5zUHJlZml4Ozxicj4KKyZuYnNwOyB0cmFuc2llbnQgIXJlc29sdmUgcmVmIEVGYWN0b3J5WzFdI2VQYWNrYWdlIGVGYWN0b3J5SW5zdGFuY2U7PGJyPgorJm5ic3A7IHZhbCBFQ2xhc3NpZmllclsqXSNlUGFja2FnZSBlQ2xhc3NpZmllcnM7PGJyPgorJm5ic3A7IHZhbCBFUGFja2FnZVsqXSNlU3VwZXJQYWNrYWdlIGVTdWJwYWNrYWdlczs8YnI+CismbmJzcDsgcmVhZG9ubHkgdHJhbnNpZW50IHJlZiBFUGFja2FnZSNlU3VicGFja2FnZXMgZVN1cGVyUGFja2FnZTs8YnI+Cit9PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KK0ZvciBub3cgd2UganVzdCB3YW50IHRvIHBvaW50IG91dCB0aGF0IHRoZSBzeW50YXggZm9yIGNsYXNzIGZlYXR1cmVzIGlzCitiYXNlZCBvbiB0aGUgc3ludGF4IG9mIEphdmEgd2l0aCBvbmUga2V5IGRpZmZlcmVuY2UuJm5ic3A7IEluIEphdmEgc29tZQorZWxlbWVudHMgYXJlIGludHJvZHVjZWQgd2l0aCBzcGVjaWFsIGtleXdvcmRzIGxpa2UgPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmNsYXNzPC9zcGFuPiBhbmQgPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmludGVyZmFjZTwvc3Bhbj4sIGJ1dCB0eXBlIG1lbWJlcnMKK2xpa2UgZmllbGRzIGFuZCBtZXRob2RzIGhhdmUgbm8gc3VjaCBrZXl3b3JkcyB0byBpbnRyb2R1Y2UgdGhlbS4mbmJzcDsKK1RoaXMgd29ya3MgZm9yIEphdmEgYmVjYXVzZSBmaWVsZHMgYW5kIG1ldGhvZHMgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgYnkKK2xvb2tpbmcgYXQgb3RoZXIgc3ludGFjdGljIGZlYXR1ZXMgKG1ldGhvZHMgaGF2ZSBwYXJlbnRoZXNpcyBhbmQgZmllbGRzCitkbyBub3QpLiZuYnNwOyBIb3dldmVyIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHdoYXQgRU1GIGNhbGxzCithdHRyaWJ1dGVzIGFuZCByZWZlcmVuY2VzIGRvZXNuJ3QgcmVhbGx5IGV4aXN0IGluIEphdmEsIHNvIHRoZXJlIGlzIG5vCitkaXN0aW5ndWlzaGluZyBzeW50YXguJm5ic3A7IEJlY2F1c2Ugb2YgdGhpcyBhbmQgYmVjYXVzZSBjbGFzcyBmZWF0dXJlcworYXJlIHN1Y2ggYW4gZXNzZW50aWFsIGVsZW1lbnQgb2YgRU1GLCBhIGRlY2lzaW9uIHdhcyBtYWRlIHRvIHVzZQora2V5d29yZHMgdG8gaW50cm9kdWNlIGFuZCBkaWZmZXJlbnRpYXRlIGF0dHJpYnV0ZXMsIHJlZmVyZW5jZXMgYW5kCitvcGVyYXRpb25zLiZuYnNwOyBUaHVzIGluIEVtZmF0aWMgdGhlIGJhc2ljIHN5bnRheCBmb3IgYSBjbGFzcyBmZWF0dXJlCitsb29rcyBsaWtlIHRoaXM6PGJyPgorPGJyPgorPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDQwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+bW9kaWZpZXJzCismbmJzcDsgZmVhdHVyZUtpbmQgJm5ic3A7IHR5cGVFeHByZXNzaW9uICZuYnNwOyBuYW1lPC9zcGFuPiAmbmJzcDsgJzsnPGJyPgorPC9kaXY+Cis8YnI+CitXaGVyZSA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+ZmVhdHVyZUtpbmQ8L3NwYW4+IGlzIG9uZSBvZgordGhlIGZvdXIga2V5d29yZHMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZS48YnI+Cis8YnI+Cis8dGFibGUgc3R5bGU9IndpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIKKyBjZWxsc3BhY2luZz0iMiI+CisgIDxjYXB0aW9uPlRhYmxlIDQuMSAtIENsYXNzIEZlYXR1cmUgS2luZCBLZXl3b3Jkczxicj4KKyAgPC9jYXB0aW9uPjx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyMDQpOyI+RW1mYXRpYwora2V5d29yZDxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyMDQpOyI+aW50cm9kdWNlczxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyI+YXR0cjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5FQXR0cmlidXRlPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij5vcDxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5FT3BlcmF0aW9uPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij5yZWY8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+bm9ybWFsIEVSZWZlcmVuY2UKKyhFUmVmZXJlbmNlLmNvbnRhaW5tZW50ID0gZmFsc2UpPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7Ij52YWw8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+ImJ5IHZhbHVlIiBFUmVmZXJlbmNlCisoRVJlZmVyZW5jZS5jb250YWlubWVudCA9IHRydWUpPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KKzxoMz40LjEgTW9kaWZpZXJzPC9oMz4KK0xvb2sgYWdhaW4gYXQgdGhlIEVtZmF0aWMgY29kZSBhYm92ZSBmb3IgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FUGFja2FnZTwvc3Bhbj4gYW5kIG5vdGUgaW4gdGhlIGxhc3QgY2xhc3MKK2ZlYXR1cmUgZGVjbGFyYXRpb24gdGhlIGtleXdvcmQgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5yZWY8L3NwYW4+CitpcyBwcmVjZWRlZCBieSB0aGUgd29yZHMgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5yZWFkb25seTwvc3Bhbj4KK2FuZCA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnRyYW5zaWVudDwvc3Bhbj4uJm5ic3A7CitUaGVzZSBhcmUgbW9kaWZpZXJzIHNpbWlsYXIgaW4gc3Bpcml0IHRvIEphdmEncyBtb2RpZmllcnMgc3VjaCBhcworPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5wdWJsaWM8L3NwYW4+LCA8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+cHJpdmF0ZTwvc3Bhbj4gYW5kIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5hYnN0cmFjdDwvc3Bhbj4uJm5ic3A7IEhvd2V2ZXIgdGhlc2UKK21vZGlmaWVycyBtYXAgdG8KK2Jvb2xlYW4gYXR0cmlidXRlcyBvbiB0aGUgRWNvcmUgY2xhc3NlcyBpbnZvbHZlZCBpbiBkZWZpbmluZyBzdHJ1Y3R1cmFsCithbmQgYmVoYXZpb3JhbCBmZWF0dXJlcy4mbmJzcDsgVGhlc2UgbW9kaWZpZXJzIG11c3QgYXBwZWFyIGRpcmVjdGx5CitiZWZvcmUgdGhlIGZlYXR1cmUncyB0eXBlIGV4cHJlc3Npb24uJm5ic3A7IFRoZSB0YWJsZSBiZWxvdyBkZXNjcmliZXMKK2VhY2gKK21vZGlmaWVyLjxicj4KKzxicj4KKzx0YWJsZSBzdHlsZT0id2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGxlZnQ7IiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIgorIGNlbGxzcGFjaW5nPSIyIj4KKyAgPGNhcHRpb24+VGFibGUgNC4yIC0gQ2xhc3MgRmVhdHVyZSBNb2RpZmllcnM8YnI+CisgIDwvY2FwdGlvbj48dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjA0KTsiPm1vZGlmaWVyPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDIwNCk7Ij5tZWFuczxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyMDQpOyI+YXBwbGllcwordG88YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnJlYWRvbmx5PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVTdHJ1Y3R1cmFsRmVhdHVyZS5jaGFuZ2VhYmxlID0KK2ZhbHNlPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPmF0dHJpYnV0ZSwgcmVmZXJlbmNlPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij52b2xhdGlsZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5FU3RydWN0dXJhbEZlYXR1cmUudm9sYXRpbGUgPQordHJ1ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5hdHRyaWJ1dGUsIHJlZmVyZW5jZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyI+dHJhbnNpZW50PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVTdHJ1Y3R1cmFsRmVhdHVyZS50cmFuc2llbnQgPQordHJ1ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5hdHRyaWJ1dGUsIHJlZmVyZW5jZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyI+dW5zZXR0YWJsZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5FU3RydWN0dXJhbEZlYXR1cmUudW5zZXR0YWJsZSA9Cit0cnVlPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPmF0dHJpYnV0ZSwgcmVmZXJlbmNlPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5kZXJpdmVkPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVTdHJ1Y3R1cmFsRmVhdHVyZS5kZXJpdmVkID0gdHJ1ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5hdHRyaWJ1dGUsIHJlZmVyZW5jZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyI+dW5pcXVlPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVUeXBlZEVsZW1lbnQudW5pcXVlID0gdHJ1ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5hdHRyaWJ1dGUsIHJlZmVyZW5jZSwgb3BlcmF0aW9uLAorcGFyYW1ldGVyPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5vcmRlcmVkPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVUeXBlZEVsZW1lbnQub3JkZXJlZCA9IHRydWU8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+YXR0cmlidXRlLCByZWZlcmVuY2UsIG9wZXJhdGlvbiwKK3BhcmFtZXRlcjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyI+cmVzb2x2ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5FUmVmZXJlbmNlLnJlc29sdmVQcm94aWVzID0gdHJ1ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5yZWZlcmVuY2U8YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmlkPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkVBdHRyaWJ1dGUuaUQgPSB0cnVlPGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPmF0dHJpYnV0ZTxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitOb3RlIHRoYXQgdGhlIG1lYW5pbmcgb2YgYSBtb2RpZmllciBtYXkgYmUgbmVnYXRlZCBieSBwcmVmaXhpbmcgdGhlIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4hPC9zcGFuPiBvcGVyYXRvci4mbmJzcDsgVGhlIGV4YW1wbGUKK2JlbG93IGRlbW9uc3RyYXRlcyB0aGlzIHdpdGggYW4gbm9uLW9yZGVyZWQgYXR0cmlidXRlOjxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5jbGFzcyBYIHs8YnI+CismbmJzcDsgIW9yZGVyZWQgYXR0ciBTdHJpbmdbKl0gczs8YnI+Cit9PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KK05vcm1hbGx5IHRoZSBvbmx5IG1vZGlmaWVycyB0aGF0IHlvdSBzaG91bGQgc2VlIG5lZ2F0ZWQgd2l0aCA8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+ITwvc3Bhbj4gYXJlIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij51bmlxdWU8L3NwYW4+LCA8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+b3JkZXJlZDwvc3Bhbj4gYW5kIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5yZXNvbHZlPC9zcGFuPi4mbmJzcDsgVGhpcyBpcyBiZWNhdXNlCit0aGVzZSB0aHJlZSBhcmUgdHJ1ZSBieSBkZWZhdWx0LCBzbyByZXZlcnNpbmcgdGhlIEVjb3JlIGRlZmF1bHQgbWVhbnMKK3VzaW5nIHRoZSA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPiE8L3NwYW4+CitvcGVyYXRvci4mbmJzcDsgTm90ZSBhbHNvIHRoYXQgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RVN0cnVjdHVyYWxGZWF0dXJlLmNoYW5nZWFibGU8L3NwYW4+CitpcyB0cnVlIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgbW9kaWZpZXIga2V5d29yZCA8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+cmVhZG9ubHk8L3NwYW4+IG1lYW5zIHRoZSBvcHBvc2l0ZSAoPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FU3RydWN0dXJhbEZlYXR1cmUuY2hhbmdlYWJsZTwvc3Bhbj4gPQorZmFsc2UpLjxicj4KKzxicj4KKzxoMz40LjIgQXR0cmlidXRlczwvaDM+CitXZSd2ZSBub3cgc2VlbiBhdHRyaWJ1dGUgbmFtaW5nIGFuZCB0eXBlIGV4cHJlc3Npb25zLiZuYnNwOyBBdHRyaWJ1dGVzCittYXkgYWxzbyBiZSBhc3NpZ25lZCBkZWZhdWx0IHZhbHVlIGV4cHJlc3Npb25zLiZuYnNwOyBCZWxvdyBpcyBhbgorZXhhbXBsZSBzaG93aW5nIHRoZSB2YXJpb3VzIGZvcm1zIG9mCithdHRyaWJ1dGUgc3ludGF4Ljxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5jbGFzcyBDIHs8YnI+CismbmJzcDsgYXR0ciBTdHJpbmcgczs8YnI+CismbmJzcDsgYXR0ciBpbnQgaSA9IDE7PGJyPgorJm5ic3A7IGF0dHIgZWNvcmUuRUJvb2xlYW4gYiA9IHRydWU7PGJyPgorfTxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitBZ2FpbiBub3RlIHRoYXQgdGhlIGRlY2xhcmF0aW9uIG9mIGF0dHJpYnV0ZXMgaXMgYmFzaWNhbGx5IGlkZW50aWNhbCB0bworZGVjbGFyYWluZyBmaWVsZHMgaW4gSmF2YSBleGNlcHQgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmF0dHI8L3NwYW4+IGtleXdvcmQuPGJyPgorPGJyPgorPGgzPjQuMyBSZWZlcmVuY2VzPC9oMz4KK1RoZSB0eXBlIGV4cHJlc3Npb24gc3ludGF4IGZvciByZWZlcmVuY2VzIGlzIHNsaWdodGx5IGNvbXBsaWNhdGVkIGJ5Cit0aGUgZmFjdCB0aGF0IHdlIG5lZWQgc29tZSB3YXkgdG8gaWRlbnRpZnkgdGhlIG9wcG9zaXRlIG9mIGEKK3JlZmVyZW5jZS4mbmJzcDsgTGV0J3MgcmV0dXJuIGFnYWluIHRvIHRoZSBjb2RlIGZvciA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVQYWNrYWdlPC9zcGFuPiwgYnV0IHdlJ2xsIGp1c3QgbG9vayBhdCB0aGUKK2xhc3QgdHdvIGZlYXR1cmUgZGVjbGFyYXRpb25zOjxicj4KKzxicj4KKzx0YWJsZQorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyIKKyBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij5jbGFzcyBFUGFja2FnZSBleHRlbmRzCitFTmFtZWRFbGVtZW50IHs8YnI+CismbmJzcDsgLy8gLi4uPGJyPgorJm5ic3A7IHZhbCBFUGFja2FnZVsqXSNlU3VwZXJQYWNrYWdlIGVTdWJwYWNrYWdlczs8YnI+CismbmJzcDsgcmVhZG9ubHkgdHJhbnNpZW50IHJlZiBFUGFja2FnZSNlU3VicGFja2FnZXMgZVN1cGVyUGFja2FnZTs8YnI+Cit9PC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KK05vdGljZSB0aGF0IHRoZSB0eXBlIGV4cHJlc3Npb25zIGFyZSBmb2xsb3dlZCBieSBhIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4jPC9zcGFuPiBzeW1ib2wgYW5kIGFuCitpZGVudGlmZXIuJm5ic3A7IFRoaXMgaWRlbnRpZmllciBuYW1lcyB0aGUgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FUmVmZXJlbmNlPC9zcGFuPiB3aGljaCBpcyB0aGUgPHNwYW4KKyBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5vcHBvc2l0ZTwvc3Bhbj4gb2YgdGhlIHJlZmVyZW5jZSBiZWluZworZGVjbGFyZWQuJm5ic3A7IElmIGEgcmVmZXJlbmNlIGRvZXNuJ3QgbmVlZCB0byBzcGVjaWZ5IGl0cyBvcHBvc2l0ZQordGhlbiB0aGF0CitwYXJ0IChpbmNsdWRpbmcgdGhlIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+Izwvc3Bhbj4KK3N5bWJvbCkgaXMgb21pdHRlZC48YnI+Cis8YnI+Cis8aDM+NC40IE9wZXJhdGlvbnM8L2gzPgorVGhlIGRlY2xhcmF0aW9uIHN5bnRheCBmb3Igb3BlcmF0aW9ucyBpcyBKYXZhLWxpa2UgYXMgZGVzY3JpYmVkIGFib3ZlLAoraW5jbHVkaW5nIHVzZSBvZiB0aGUga2V5d29yZCA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnZvaWQ8L3NwYW4+Cit0byBpZGVudGlmeSBvcGVyYXRpb25zIHdoaWNoIGRvbid0IHJldHVybiBhIHZhbHVlLiZuYnNwOyBBbHNvIGEKK0phdmEtbGlrZSA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnRocm93czwvc3Bhbj4gY2xhdXNlCithbGxvd3MgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBleGNlcHRpb24gdHlwZXM6PGJyPgorPGJyPgorPHRhYmxlCisgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsgd2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGxlZnQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IgorIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIyIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPmNsYXNzIFggezxicj4KKyZuYnNwOyBvcCBTdHJpbmcgZ2V0RnVsbE5hbWUoKTs8YnI+CismbmJzcDsgb3Agdm9pZCByZXR1cm5zTm90aGluZygpOzxicj4KKyZuYnNwOyBvcCBpbnQgYWRkKGludCBhLCBpbnQgYik7PGJyPgorJm5ic3A7IG9wIEVPYmplY3QgZG9Tb21ldGhpbmcoaW50IGEsIGVjb3JlLkVCb29sZWFuIGIpIHRocm93cworRXhjZXB0aW9uQSwgRXhjZXB0aW9uQjs8YnI+Cit9PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48L3NwYW4+PGJyPgorPGJyPgorPGgyPgorNS4gQW5ub3RhdGlvbnM8L2gyPgorQW5ub3RhdGlvbnMgY2FuIGJlIGF0dGFjaGVkIHRvIGV2ZXJ5IGtpbmQgb2YgRU1GIGVsZW1lbnQsIGhvd2V2ZXIgb25seQordGhlIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPnNvdXJjZTwvc3Bhbj4gYW5kIDxzcGFuCisgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+ZGV0YWlsczwvc3Bhbj4gZmVhdHVyZXMgb2YgdGhlIHJlc3VsdGluZyA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkVBbm5vdGF0aW9uPC9zcGFuPiBjYW4gYmUKK3NwZWNpZmllZCBpbiBFbWZhdGljLiZuYnNwOyBUaGUgRW1mYXRpYyBzeW50YXggZm9yIHJlcHJlc2VudGluZyBFTUYKK2Fubm90YXRpb25zIHdhcyBpbnNwaXJlZCBieSB0aGUKK3N5bnRheCBiZWluZyBpbnRyb2R1Y2VkIGZvciBKYXZhIGFubm90YXRpb25zIGluIEphdmEgMS41CisoIlRpZ2VyIikuJm5ic3A7IFRoZSA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkA8L3NwYW4+CitzeW1ib2wgaXMgZm9sbG93ZWQgYnkgdGhlIHZhbHVlIG9mIHRoZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5FQW5ub3RhdGlvbjwvc3Bhbj4KKzxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPnNvdXJjZTwvc3Bhbj4KK2F0dHJpYnV0ZS4mbmJzcDsgS2V5L3ZhbHVlIHBhaXJzIGZvciB0aGUgYW5ub3RhdGlvbiA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPmRldGFpbHM8L3NwYW4+IG1heSBhcHBlYXIgaW4gcGFyZW50aGVzaXMKK2ZvbGxvd2luZyB0aGUgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+c291cmNlPC9zcGFuPgordmFsdWUuJm5ic3A7IE11bHRpcGxlCithbm5vdGF0aW9ucyBjYW4gYmUgYXR0YWNoZWQgdG8gZWFjaCBlbGVtZW50LiZuYnNwOyBVc3VhbGx5IHRoZQorYW5ub3RhdGlvbiBhcHBlYXJzIGp1c3QgYmVmb3JlIGl0cyBjb250YWluaW5nIGVsZW1lbnQgKHBhcmFtZXRlciBhbmQKK2VudW0gbGl0ZXJhbCBhbm5vdGF0aW9ucyBtYXkgYXBwZWFyIGp1c3QgYWZ0ZXIgdGhlIGRlY2xhcmF0aW9uKS4mbmJzcDsKK1RoZSBleGFtcGxlIGJlbG93IGdpdmVzIHNvbWUgZXhhbXBsZXMgb2YgYW5ub3RhdGlvbnMuPGJyPgorPGJyPgorPHRhYmxlCisgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsgd2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGxlZnQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IgorIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIyIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkAiaHR0cDovL3NvdXJjZS91cmkiKCJrZXkxIj0idmFsdWUxIiwKKyJrZXkyIj0idmFsdWUyIik8YnI+CitAc291cmNlTGFiZWwoa2V5LmE9InZhbHVlMSIsIGtleS5iPSJ2YWx1ZTIiKTxicj4KK0BzaW1wbGVBdHRyPGJyPgorcGFja2FnZSB0ZXN0Ozxicj4KKyAgICAgIDxicj4KK0AiaHR0cDovL2NsYXNzL2Fubm90YXRpb24iKGs9InYiKTxicj4KK2NsYXNzIEMgezxicj4KKyZuYnNwOyBAImh0dHA6Ly9hdHRyaWJ1dGUvYW5ub3RhdGlvbiIoaz0idiIpPGJyPgorJm5ic3A7IGF0dHIgaW50IGE7PGJyPgorICAgICAgPGJyPgorJm5ic3A7IG9wIGludCBPcCg8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsgQGJlZm9yZShrPXYpIGludCBhLDxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyBpbnQgYiBAYWZ0ZXIoaz12KTxicj4KKyZuYnNwOyApOzxicj4KK308YnI+CisgICAgICA8YnI+CitlbnVtIEUgezxicj4KKyZuYnNwOyBAImh0dHA6Ly9iZWZvcmUiKGs9dik8YnI+CismbmJzcDsgQT0xOzxicj4KKyZuYnNwOyBCPTIgQCJodHRwOi8vYWZ0ZXIiKGs9dik7PGJyPgorfTxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8YnI+CitPbmUgc3VidGxlIHBvaW50Cit0byBub3RlIGlzIHRoYXQgZG91YmxlIHF1b3RlcyBhcmUgb25seSByZXF1aXJlZCBhcm91bmQgdGhlIHN0cmluZyB2YWx1ZQoraWYgaXQgaXMgbm90IGEgdmFsaWQgc2ltcGxlIG9yIHF1YWxpZmllZCBpZGVudGlmaWVyLiZuYnNwOyBTbyBhbgoraWRlbnRpZmllcgorbGlrZSA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmtleTwvc3Bhbj4gb3IgPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmtleS5hLmIuYzwvc3Bhbj4gbmVlZCBub3QgYmUgcXVvdGVkLAorYnV0IG1vc3QgY29tcGxleCBzdHJpbmdzIChzdWNoIGFzIHVybHMpIHdpbGwgbmVlZCB0byBiZS48YnI+Cis8YnI+Cis8aDM+NS4xIEFubm90YXRpb24gTGFiZWxzPGJyPgorPC9oMz4KK0VtZmF0aWMgYWxsb3dzIGZvciBzaG9ydCBsYWJlbHMgdG8gYmUgZGVmaW5lZCB0aGF0IG1hcCB0byBsb25nZXIgVVJJCit2YWx1ZXMgZm9yIHRoZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5zb3VyY2U8L3NwYW4+CithdHRyaWJ1dGUgb2YgYW4gPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+RUFubm90YXRpb248L3NwYW4+LiZuYnNwOworVGhlIHB1cnBvc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHRvIHNpbXBsaWZ5IHRoZSBFbWZhdGljIGNvZGUsIG1ha2luZyBpdAorZWFzaWVyIHRvIHJlYWQgYW5kIGVkaXQuJm5ic3A7IFNldmVyYWwgYW5ub3RhdGlvbiBsYWJlbHMgYXJlIGF2YWlsYWJsZQorYnkgZGVmYXVsdCwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZTo8YnI+Cis8YnI+Cis8dGFibGUgc3R5bGU9IndpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBsZWZ0OyIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIKKyBjZWxsc3BhY2luZz0iMiI+CisgIDx0Ym9keT4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyMDQpOyI+RW1mYXRpYworYW5ub3RhdGlvbiBsYWJlbDxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQKKyBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyMDQpOyI+bWFwcwordG8gRUFubm90YXRpb24uc291cmNlIHZhbHVlPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZAorIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA0LCAyMDQsIDI1NSk7IHZlcnRpY2FsLWFsaWduOiB0b3A7Ij48c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+RWNvcmU8L3NwYW4+PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPjxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQKKyBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCwgMjA0LCAyNTUpOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+PHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkdlbk1vZGVsPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij48c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbDwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsgdmVydGljYWwtYWxpZ246IHRvcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkV4dGVuZGVkTWV0YURhdGE8YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+PHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YTwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkCisgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsgdmVydGljYWwtYWxpZ246IHRvcDsiPjxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5FbWZhdGljQW5ub3RhdGlvbk1hcDwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+PHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDQvRW1mYXRpY0Fubm90YXRpb25NYXA8L3NwYW4+PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KK1RoZSBjb2RlIGJlbG93IHNob3dzIHNvbWUgZXhhbXBsZXM6PGJyPgorPGJyPgorPHRhYmxlCisgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYigyMDQsIDIwNCwgMjU1KTsgd2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGxlZnQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IgorIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIyIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkBFbWZhdGljQW5ub3RhdGlvbk1hcChteUxhYmVsPSJodHRwOi8vZm9vL2JhciIpPGJyPgorQGdlbm1vZGVsKGRvY3VtZW50YXRpb249Im1vZGVsIGRvY3VtZW50YXRpb24iKTxicj4KK3BhY2thZ2UgdGVzdDs8YnI+CisgICAgICA8YnI+CitAZWNvcmUoY29uc3RyYWludHM9ImNvbnN0cmFpbnRBIGNvbnN0cmFpbnRCIik8YnI+CitAbXlMYWJlbChrZXk9InZhbHVlIik8YnI+CitjbGFzcyBDIHs8YnI+Cit9PGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3Rib2R5PgorPC90YWJsZT4KKzxicj4KK1RoZXJlIGFyZSBzZXZlcmFsIGRldGFpbHMgdG8gZWxhYm9yYXRlIG9uIGluIHRoZSBleGFtcGxlIGFib3ZlLiZuYnNwOworRmlyc3Qgbm90ZSB0aGF0IGxhYmVscyBhcmUgbm90IGNhc2Ugc2Vuc2l0aXZlIChzbyA8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+RWNvcmU8L3NwYW4+IGFuZCA8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+ZWNvcmU8L3NwYW4+IGFuZCA8c3BhbgorIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+RUNPUkU8L3NwYW4+IGFsbCB3b3JrIHRoZSBzYW1lIHdheSkuPGJyPgorPGJyPgorU2Vjb25kLCBub3RlIHRoYXQgZGVjbGFyaW5nIGFuIGFubm90YXRpb24gdXNpbmcgdGhlIGxhYmVsIDxzcGFuCisgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5FbWZhdGljQW5ub3RhdGlvbk1hcDwvc3Bhbj4gaGFzIHRoZQorc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgYSBuZXcgbGFiZWwgd2hpY2ggY2FuIGJlIHVzZWQgbGF0ZXIgaW4gdGhlCitwcm9ncmFtLiZuYnNwOyBTbyB0aGUgc2Vjb25kIGFubm90YXRpb24gb24gY2xhc3MgIkMiIHdpbGwgZ2V0IHRoZSA8c3BhbgorIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPnNvdXJjZTwvc3Bhbj4gdmFsdWUgb2YgPHNwYW4KKyBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPiJodHRwOi8vZm9vL2JhciI8L3NwYW4+Ljxicj4KKzxicj4KK0ZpbmFsbHksIG5vdGUgdGhhdCB0aGUgY29kZSBhYm92ZSBzaG93cyBob3cgdG8gaW50cm9kdWNlIG1vZGVsCitkb2N1bWVudGF0aW9uIGFuZCBjb25zdHJhaW50cyBpbiBhIHdheSB0aGF0IHdpbGwgbGF0ZXIgZmxvdyBpbnRvCitnZW5lcmF0ZWQgSmF2YSBjb2RlIHdoZW4gd29ya2luZyB3aXRoIGFuIEVNRiBnZW5tb2RlbC48YnI+Cis8YnI+Cis8L2JvZHk+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvaHRtbC90b2MuaHRtbCBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9odG1sL3RvYy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzZhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvaHRtbC90b2MuaHRtbApAQCAtMCwwICsxLDM3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbD4KKzxoZWFkPgorCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorCTxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0iYm9vay5jc3MiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KKwk8dGl0bGU+VGFibGUgb2YgQ29udGVudHM8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKzxoMT5UYWJsZSBvZiBDb250ZW50czwvaDE+CisKKzx1bD4KKyAgCisgIDxsaT4gR2V0dGluZyBzdGFydGVkOgorICAJCTx1bD4KKyAgCQkJPGxpPjxhIGhyZWY9ImdldHRpbmdzdGFydGVkL2V4YW1wbGUuaHRtbCI+RW1mYXRpYyBHZXR0aW5nIFN0YXJ0ZWQgR3VpZGU8L2E+PC9saT4KKwkJICAgIDxsaT48YSBocmVmPSJnZXR0aW5nc3RhcnRlZC9HVUlGZWF0dXJlcy5odG0iPlVzYWJpbGl0eSBmZWF0dXJlcyBvZiB0aGUgZWRpdG9yPC9hPjwvbGk+CisgIAkJCTxsaT48YSBocmVmPSJnZXR0aW5nc3RhcnRlZC9GdXR1cmVXb3JrLmh0bSI+SWRlYXMgZm9yIEZ1dHVyZSBXb3JrPC9hPjwvbGk+CisgIAkJPC91bD4KKyAgPC9saT4KKworICA8bGk+IFJlZmVyZW5jZToKKyAgCQk8dWw+CisgIAkJCTxsaT48YSBocmVmPSJyZWZlcmVuY2UvTGFuZ3VhZ2VSZWYuaHRtbCI+TGFuZ3VhZ2UgUmVmZXJlbmNlPC9hPgorICAJCQkgICAgIChuZWVkcyB0byBiZSB1cGRhdGVkIHRvIGluY2x1ZGUgZXhhbXBsZXMgb2YgdXNhZ2Ugb2YgR2VuZXJpY3MpCisgIAkJCTwvbGk+CisJCSAgICA8bGk+PGEgaHJlZj0icmVmZXJlbmNlL0VtZmF0aWMwMDJVcGRhdGUuaHRtbCI+RW1mYXRpYyAwLjAuMiBVcGRhdGU8L2E+PC9saT4KKyAgCQkJPGxpPjxhIGhyZWY9InJlZmVyZW5jZS9FbWZhdGljR3JhbW1hci5odG1sIj5FbWZhdGljIEdyYW1tYXIgaW4gR3ltbmFzdCBmb3JtYXQ8L2E+PC9saT4KKyAgCQk8L3VsPgorICA8L2xpPgorICA8bGk+IDxhIGhyZWY9ImFib3V0Lmh0bWwiPkxlZ2FsPC9hPjwvbGk+CisKKzwvdWw+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MzQxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvcGx1Z2luLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgorPHBsdWdpbj4KKworICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KKyAgICAgIDx0b2MKKyAgICAgICAgICAgIGZpbGU9InRvYy54bWwiCisgICAgICAgICAgICBwcmltYXJ5PSJ0cnVlIj4KKyAgICAgIDwvdG9jPgorICAgICAgPHRvYworICAgICAgICAgICAgZmlsZT0idG9jZ2V0dGluZ3N0YXJ0ZWQueG1sIj4KKyAgICAgIDwvdG9jPgorICAgICAgPHRvYworICAgICAgICAgICAgZmlsZT0idG9jcmVmZXJlbmNlLnhtbCI+CisgICAgICA8L3RvYz4KKyAgIDwvZXh0ZW5zaW9uPgorCis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci90b2MueG1sIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL3RvYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5ZWMzZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci90b2MueG1sCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgorCis8dG9jIGxhYmVsPSJFTUZUIEVtZmF0aWMiIHRvcGljPSJodG1sL3RvYy5odG1sIj4KKyAgIDx0b3BpYyBsYWJlbD0iR2V0dGluZyBTdGFydGVkIj4KKyAgICAgIDxhbmNob3IgaWQ9ImdldHRpbmdzdGFydGVkIi8+CisgICA8L3RvcGljPgorICAgPHRvcGljIGxhYmVsPSJSZWZlcmVuY2UiPgorICAgICAgPGFuY2hvciBpZD0icmVmZXJlbmNlIi8+CisgICA8L3RvcGljPgorPC90b2M+CmRpZmYgLS1naXQgYS9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL3RvY2dldHRpbmdzdGFydGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI3NmFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmRvYy51c2VyL3RvY2dldHRpbmdzdGFydGVkLnhtbApAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KKworPHRvYyBsYWJlbD0iR2V0dGluZyBTdGFydGVkIiBsaW5rX3RvPSJ0b2MueG1sI2dldHRpbmdzdGFydGVkIj4KKyAKKwk8dG9waWMgbGFiZWw9IkVtZmF0aWMgR2V0dGluZyBTdGFydGVkIEd1aWRlIiAgCisJICAgICAgIGhyZWY9Imh0bWwvZ2V0dGluZ3N0YXJ0ZWQvZXhhbXBsZS5odG1sIj4gCisJPC90b3BpYz4KKwkKKwk8dG9waWMgbGFiZWw9IlByb2R1Y3Rpdml0eSBmZWF0dXJlcyBpbiB0aGUgZWRpdG9yIgorICAgICAgICAgICBocmVmPSJodG1sL2dldHRpbmdzdGFydGVkL0dVSUZlYXR1cmVzLmh0bSIgPgorCTwvdG9waWM+CisJCisJPHRvcGljIGxhYmVsPSJQb3NzaWJpbGl0aWVzIGZvciBGdXR1cmUgV29yayIKKyAgICAgICAgICAgaHJlZj0iaHRtbC9nZXR0aW5nc3RhcnRlZC9GdXR1cmVXb3JrLmh0bSIgPgorCTwvdG9waWM+CisJIAorPC90b2M+CmRpZmYgLS1naXQgYS9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvdG9jcmVmZXJlbmNlLnhtbCBiL2RvYy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlci90b2NyZWZlcmVuY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTE3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuZG9jLnVzZXIvdG9jcmVmZXJlbmNlLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KKworPHRvYyBsYWJlbD0iUmVmZXJlbmNlIiBsaW5rX3RvPSJ0b2MueG1sI3JlZmVyZW5jZSI+IAorCTx0b3BpYyBsYWJlbD0iTGFuZ3VhZ2UgUmVmZXJlbmNlIiAgCisJICAgIGhyZWY9Imh0bWwvcmVmZXJlbmNlL0xhbmd1YWdlUmVmLmh0bWwiPiAKKwk8L3RvcGljPgorCQorCTx0b3BpYyBsYWJlbD0iRW1mYXRpYyAwLjAuMiBVcGRhdGUiIAorICAgICAgICAgICAgaHJlZj0iaHRtbC9yZWZlcmVuY2UvRW1mYXRpYzAwMlVwZGF0ZS5odG1sIiA+IAorCTwvdG9waWM+CisJCisJPHRvcGljIGxhYmVsPSJFbWZhdGljIEdyYW1tYXIgaW4gR3ltbmFzdCBmb3JtYXQiIAorICAgICAgICAgICAgaHJlZj0iaHRtbC9yZWZlcmVuY2UvRW1mYXRpY0dyYW1tYXIuaHRtbCIgPiAKKwk8L3RvcGljPiAKKwkKKwk8dG9waWMgbGFiZWw9IkVtZmF0aWMgUmFpbHJvYWQgRGlhZ3JhbXMiIAorICAgICAgICAgICAgaHJlZj0iaHRtbC9yZWZlcmVuY2UvRW1mYXRpY1JhaWxyb2FkRGlhZ3JhbXMuaHRtbCIgPiAKKwk8L3RvcGljPiAKKwkKKzwvdG9jPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMtZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLWZlYXR1cmUvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhYTdiMQotLS0gL2Rldi9udWxsCisrKyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLWZlYXR1cmUvLnByb2plY3QKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMtZmVhdHVyZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLWZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGY5M2E5Ci0tLSAvZGV2L251bGwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMtZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEgQEAKK2Jpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMtZmVhdHVyZS9mZWF0dXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGRkNjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMtZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGZlYXR1cmUKKyAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpY19mZWF0dXJlIgorICAgICAgbGFiZWw9IkVtZmF0aWMgKEluY3ViYXRpb24pIgorICAgICAgdmVyc2lvbj0iMC4zLjAucXVhbGlmaWVyIgorICAgICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgorCisgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FbWZhdGljIj4KKyAgICAgIEVtZmF0aWMgaXMgYSB0ZXh0IGVkaXRvciBzdXBwb3J0aW5nIG5hdmlnYXRpb24sIGVkaXRpbmcsICBhbmQgY29udmVyc2lvbiBvZiBFY29yZSBtb2RlbHMsIHVzaW5nIGEgY29tcGFjdCBhbmQgaHVtYW4tcmVhZGFibGUgc3ludGF4IHNpbWlsYXIgdG8gSmF2YS4gIFRoZSBFUExlZCBFbWZhdGljIG5vdyBob3N0ZWQgYXQgRU1GVCBleHRlbmRzIHRoZSBGZWIgMjAwNSBhbHBoYXdvcmtzIHJlbGVhc2Ugd2l0aCBzdXBwb3J0IGZvciAgRU1GIEdlbmVyaWNzLCBmb2xkaW5nLCAmcXVvdDtyZWQgc3F1aWdnbGllcyZxdW90OywgYW4gRU1GIFR5cGUgSGllcmFyY2h5LCBoeXBlcmxpbmtzLCBBdXRvRWRpdHMsIGFuZCB0aGUgcG9zc2liaWxpdHkgdG8gZGVmaW5lIHRlbXBsYXRlcyB0byBzcGVlZCB1cCBkb2N1bWVudCBjcmVhdGlvbiwgYW1vbmcgb3RoZXIgdXNhYmlsaXR5IGZlYXR1cmVzLiBUaGUgYmVzdCB3YXkgdG8gZ2FpbiBoYW5kcy1vbiBleHBlcmllbmNlIHdpdGggRW1mYXRpYyBpcyB0byByaWdodC1jbGljayBvbiBhbnkgLmVjb3JlIGZpbGUgYW5kIGNob29zZSBHZW5lcmF0ZSBFbWZhdGljIHNvdXJjZSwgYSBzaW1pbGFyIGNvbnZlcnRlciB3b3JrcyBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLiAgT25saW5lIGhlbHAgaXMgYWxzbyBhdmFpbGFibGUuICAKKworRW1mYXRpYyBpcyBob3N0ZWQgYXMgYW4gRU1GVCBjb21wb25lbnQgd2l0aCBJbmN1YmF0aW9uIHN0YXR1cy4KKyAgIDwvZGVzY3JpcHRpb24+CisKKyAgIDxjb3B5cmlnaHQ+CisgICAgICBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgICA8L2NvcHlyaWdodD4KKworICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+CisgICAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjAKKyAgIDwvbGljZW5zZT4KKworICAgPHJlcXVpcmVzPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuY29uc29sZSIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC51aSIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUudWkiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lX2ZlYXR1cmUiIHZlcnNpb249IjAuMS4wIi8+CisgICA8L3JlcXVpcmVzPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjMuMC5xdWFsaWZpZXIiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjMuMC5xdWFsaWZpZXIiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5kb2MudXNlciIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjMuMC5xdWFsaWZpZXIiCisgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisKKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1YWMwNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwNzdhNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK2JpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjlhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3MmFiZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDI1IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlUGx1Z2luLm5hbWUgKEluY3ViYXRpb24pCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlCitCdW5kbGUtVmVyc2lvbjogMC4zLjAucXVhbGlmaWVyCitCdW5kbGUtQ2xhc3NQYXRoOiAuCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLkVtZmF0aWNDb3JlUGx1Z2luCitCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZworQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZSwKKyBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lY29yZSwKKyBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lbWZhdGljLAorIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJpY3MudXRpbCwKKyBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdCwKKyBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLnBhcnNlciwKKyBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLnV0aWwKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKKyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCisgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbiwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IjIuMy4wIiwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdCwKKyBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSwKKyBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZQorRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1ZTgxYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNiBAQAorc291cmNlLi4gPSBzcmMvCitvdXRwdXQuLiA9IGJpbi8KK2Jpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIGdyYW1tYXIvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9BTlRMUnYycGFyc2VyL0VtZmF0aWMuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0FOVExSdjJwYXJzZXIvRW1mYXRpYy5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NmVmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9BTlRMUnYycGFyc2VyL0VtZmF0aWMuZwpAQCAtMCwwICsxLDU1MCBAQAorCitoZWFkZXIKK3sKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5wYXJzZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuKjsKK30KKworY2xhc3MgRW1mYXRpY1BhcnNlciBleHRlbmRzIFBhcnNlcjsKKworb3B0aW9ucyB7CisgIGs9MzsKKworfQoreworICAgIHByaXZhdGUgUGFyc2VFcnJvciBjcmVhdGVQYXJzZUVycm9yKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIHJldHVybiBFbWZhdGljUGFyc2VyRHJpdmVyLmNyZWF0ZVBhcnNlRXJyb3IoZXgpOworICAgIH0KKworICAgIHByaXZhdGUgVG9rZW5JbmZvIGNyZWF0ZVRva2VuSW5mbyhUb2tlbiB0b2spIHsKKyAgICAgICAgaWYgKHRvayA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgZWxzZSByZXR1cm4gbmV3IFRva2VuSW5mbyh0b2suZ2V0VGV4dCgpLCB0b2suZ2V0Q29sdW1uKCksIHRvay5nZXRUeXBlKCkpOworICAgIH0KKworCisJcHJpdmF0ZSBQYXJzZUNvbnRleHQgX3BhcnNlQ29udGV4dDsKKwlwdWJsaWMgdm9pZCBzZXRQYXJzZUNvbnRleHQoUGFyc2VDb250ZXh0IHBhcnNlQ29udGV4dCkgeworCQlfcGFyc2VDb250ZXh0ID0gcGFyc2VDb250ZXh0OworCX0KKwkKKyAgICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICBpZiAoX3BhcnNlQ29udGV4dCAhPSBudWxsKSB7CisgICAgICAgIAlfcGFyc2VDb250ZXh0LmFkZFBhcnNlTWVzc2FnZShjcmVhdGVQYXJzZUVycm9yKGV4KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihTdHJpbmcgcykgeworICAgICAgICBpZiAoX3BhcnNlQ29udGV4dCAhPSBudWxsKSB7CisgICAgICAgIAlfcGFyc2VDb250ZXh0LmFkZFBhcnNlTWVzc2FnZShuZXcgUGFyc2VFcnJvcihzLCAtMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVwb3J0V2FybmluZyhTdHJpbmcgcykgeworICAgIAlpZiAoX3BhcnNlQ29udGV4dCAhPSBudWxsKSB7CisgICAgICAgIAlfcGFyc2VDb250ZXh0LmFkZFBhcnNlTWVzc2FnZShuZXcgUGFyc2VXYXJuaW5nKHMsIC0xKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KKworY29tcFVuaXQgcmV0dXJucyBbIENvbXBVbml0IHJldFZhbCA9IG51bGwgXQorOgoreyBQYWNrYWdlRGVjbCBwYWNrYWdlRGVjbCA9IG51bGw7IEltcG9ydFN0bXRzIGltcG9ydFN0bXRzID0gbnVsbDsgVG9wTGV2ZWxEZWNscyB0b3BMZXZlbERlY2xzID0gbnVsbDsgfQorICBwYWNrYWdlRGVjbD1wYWNrYWdlRGVjbCBpbXBvcnRTdG10cz1pbXBvcnRTdG10cyB0b3BMZXZlbERlY2xzPXRvcExldmVsRGVjbHMgRU9GCit7IHJldFZhbCA9IG5ldyBDb21wVW5pdChwYWNrYWdlRGVjbCwgaW1wb3J0U3RtdHMsIHRvcExldmVsRGVjbHMpOyB9Cis7CisKK3BhY2thZ2VEZWNsIHJldHVybnMgWyBQYWNrYWdlRGVjbCByZXRWYWwgPSBudWxsIF0KKzoKK3sgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgPSBudWxsOyBRdWFsaWZpZWRJRCBuYW1lID0gbnVsbDsgfQorICBhbm5vdGF0aW9ucz1hbm5vdGF0aW9ucyBwYWNrYWdlX0tXOiJwYWNrYWdlIiBuYW1lPXF1YWxpZmllZElEIHNlbWk6U0VNSSAKK3sgcmV0VmFsID0gbmV3IFBhY2thZ2VEZWNsKGFubm90YXRpb25zLCBjcmVhdGVUb2tlbkluZm8ocGFja2FnZV9LVyksIG5hbWUsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7IH0KKzsKKworcXVhbGlmaWVkSUQgcmV0dXJucyBbIFF1YWxpZmllZElEIHJldFZhbCA9IG5ldyBRdWFsaWZpZWRJRCgpIF0KKzoKK3sgUWlkU2VwYXJhdG9yIHFpZFNlcGFyYXRvciA9IG51bGw7IH0KKyAgaWQxOklEIHsgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhpZDEpKTsgfSAKKyAgKCBxaWRTZXBhcmF0b3I9cWlkU2VwYXJhdG9yIGlkbjpJRCB7IHJldFZhbC5hZGRDaGlsZChxaWRTZXBhcmF0b3IpOyByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGlkbikpOyB9ICkqCis7CisKK3FpZFNlcGFyYXRvciByZXR1cm5zIFsgUWlkU2VwYXJhdG9yIHJldFZhbCA9IG51bGwgXQoreyBUb2tlbiB0b2sgPSBMVCgxKTsgfQorOiAoIERPVAorICB8IERPTExBUgorICApCit7IHJldFZhbCA9IG5ldyBRaWRTZXBhcmF0b3IoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cis7CisKK3N0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHJldHVybnMgWyBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCByZXRWYWwgPSBudWxsIF0KKzoKKyAgKCByZXRWYWw9c3RyaW5nTGl0ZXJhbENvbnRhaW5lcgorICB8IHJldFZhbD1xdWFsaWZpZWRJRENvbnRhaW5lcgorICApCis7CisKK3N0cmluZ0xpdGVyYWxDb250YWluZXIgcmV0dXJucyBbIFN0cmluZ0xpdGVyYWxDb250YWluZXIgcmV0VmFsID0gbnVsbCBdCis6CisgIHN0cmluZ19saXRlcmFsOlNUUklOR19MSVRFUkFMIAoreyByZXRWYWwgPSBuZXcgU3RyaW5nTGl0ZXJhbENvbnRhaW5lcihjcmVhdGVUb2tlbkluZm8oc3RyaW5nX2xpdGVyYWwpKTsgfQorOworCitxdWFsaWZpZWRJRENvbnRhaW5lciByZXR1cm5zIFsgUXVhbGlmaWVkSURDb250YWluZXIgcmV0VmFsID0gbnVsbCBdCis6Cit7IFF1YWxpZmllZElEIHF1YWxpZmllZElEID0gbnVsbDsgfQorICBxdWFsaWZpZWRJRD1xdWFsaWZpZWRJRCAKK3sgcmV0VmFsID0gbmV3IFF1YWxpZmllZElEQ29udGFpbmVyKHF1YWxpZmllZElEKTsgfQorOworCithbm5vdGF0aW9ucyByZXR1cm5zIFsgQW5ub3RhdGlvbnMgcmV0VmFsID0gbmV3IEFubm90YXRpb25zKCkgXQorOgoreyBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBudWxsOyB9CisgICggYW5ub3RhdGlvbj1hbm5vdGF0aW9uIHsgcmV0VmFsLmFkZENoaWxkKGFubm90YXRpb24pOyB9ICkqCis7CisKK2Fubm90YXRpb24gcmV0dXJucyBbIEFubm90YXRpb24gcmV0VmFsID0gbnVsbCBdCis6Cit7IFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHNvdXJjZSA9IG51bGw7IEtleUVxdWFsc1ZhbHVlTGlzdCBrZXlFcXVhbHNWYWx1ZUxpc3QgPSBudWxsOyB9CisgIGF0OkFUIHNvdXJjZT1zdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBscGFyZW46TFBBUkVOIGtleUVxdWFsc1ZhbHVlTGlzdD1rZXlFcXVhbHNWYWx1ZUxpc3QgcnBhcmVuOlJQQVJFTiAKK3sgcmV0VmFsID0gbmV3IEFubm90YXRpb24oY3JlYXRlVG9rZW5JbmZvKGF0KSwgc291cmNlLCBjcmVhdGVUb2tlbkluZm8obHBhcmVuKSwga2V5RXF1YWxzVmFsdWVMaXN0LCBjcmVhdGVUb2tlbkluZm8ocnBhcmVuKSk7IH0KKzsKKwora2V5RXF1YWxzVmFsdWVMaXN0IHJldHVybnMgWyBLZXlFcXVhbHNWYWx1ZUxpc3QgcmV0VmFsID0gbmV3IEtleUVxdWFsc1ZhbHVlTGlzdCgpIF0KKzoKK3sgS2V5RXF1YWxzVmFsdWUga3YxID0gbnVsbDsgS2V5RXF1YWxzVmFsdWUga3ZuID0gbnVsbDsgfQorICBrdjE9a2V5RXF1YWxzVmFsdWUgeyByZXRWYWwuYWRkQ2hpbGQoa3YxKTsgfSAKKyAgKCBjb21tYTpDT01NQSBrdm49a2V5RXF1YWxzVmFsdWUgeyByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGNvbW1hKSk7IHJldFZhbC5hZGRDaGlsZChrdm4pOyB9ICkqCis7CisKK2tleUVxdWFsc1ZhbHVlIHJldHVybnMgWyBLZXlFcXVhbHNWYWx1ZSByZXRWYWwgPSBudWxsIF0KKzoKK3sgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQga2V5ID0gbnVsbDsgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgdmFsdWUgPSBudWxsOyB9CisgIGtleT1zdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBlcXVhbHM6RVFVQUxTIHZhbHVlPXN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIAoreyByZXRWYWwgPSBuZXcgS2V5RXF1YWxzVmFsdWUoa2V5LCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgdmFsdWUpOyB9Cis7CisKK2ltcG9ydFN0bXRzIHJldHVybnMgWyBJbXBvcnRTdG10cyByZXRWYWwgPSBuZXcgSW1wb3J0U3RtdHMoKSBdCis6Cit7IEltcG9ydFN0bXQgaW1wb3J0U3RtdCA9IG51bGw7IH0KKyAgKCBpbXBvcnRTdG10PWltcG9ydFN0bXQgeyByZXRWYWwuYWRkQ2hpbGQoaW1wb3J0U3RtdCk7IH0gKSoKKzsKKworaW1wb3J0U3RtdCByZXR1cm5zIFsgSW1wb3J0U3RtdCByZXRWYWwgPSBudWxsIF0KKzoKK3sgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgdXJpID0gbnVsbDsgfQorICBpbXBvcnRfS1c6ImltcG9ydCIgKCBhbGlhczpJRCBlcXVhbHM6RVFVQUxTICk/IHVyaT1zdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBzZW1pOlNFTUkgCit7IHJldFZhbCA9IG5ldyBJbXBvcnRTdG10KGNyZWF0ZVRva2VuSW5mbyhpbXBvcnRfS1cpLCBjcmVhdGVUb2tlbkluZm8oYWxpYXMpLCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgdXJpLCBjcmVhdGVUb2tlbkluZm8oc2VtaSkpOyB9Cis7CisKK3RvcExldmVsRGVjbHMgcmV0dXJucyBbIFRvcExldmVsRGVjbHMgcmV0VmFsID0gbmV3IFRvcExldmVsRGVjbHMoKSBdCis6Cit7IFRvcExldmVsRGVjbCB0b3BMZXZlbERlY2wgPSBudWxsOyB9CisgICggdG9wTGV2ZWxEZWNsPXRvcExldmVsRGVjbCB7IHJldFZhbC5hZGRDaGlsZCh0b3BMZXZlbERlY2wpOyB9ICkqCis7CisKK3RvcExldmVsRGVjbCByZXR1cm5zIFsgVG9wTGV2ZWxEZWNsIHJldFZhbCA9IG51bGwgXQorOgoreyBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyA9IG51bGw7IH0KK2Fubm90YXRpb25zPWFubm90YXRpb25zIAorICAoIHJldFZhbD1zdWJQYWNrYWdlRGVjbFthbm5vdGF0aW9uc10KKyAgfCByZXRWYWw9Y2xhc3NEZWNsW2Fubm90YXRpb25zXQorICB8IHJldFZhbD1kYXRhVHlwZURlY2xbYW5ub3RhdGlvbnNdCisgIHwgcmV0VmFsPWVudW1EZWNsW2Fubm90YXRpb25zXQorICB8IHJldFZhbD1tYXBFbnRyeURlY2xbYW5ub3RhdGlvbnNdCisgICkKKzsKKworc3ViUGFja2FnZURlY2wgWyBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyBdICByZXR1cm5zIFsgU3ViUGFja2FnZURlY2wgcmV0VmFsID0gbnVsbCBdCis6Cit7IFRvcExldmVsRGVjbHMgdG9wTGV2ZWxEZWNscyA9IG51bGw7IH0KKyAgcGFja2FnZV9LVzoicGFja2FnZSIgbmFtZTpJRCBsY3VybHk6TENVUkxZIHRvcExldmVsRGVjbHM9dG9wTGV2ZWxEZWNscyByY3VybHk6UkNVUkxZIAoreyByZXRWYWwgPSBuZXcgU3ViUGFja2FnZURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhwYWNrYWdlX0tXKSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8obGN1cmx5KSwgdG9wTGV2ZWxEZWNscywgY3JlYXRlVG9rZW5JbmZvKHJjdXJseSkpOyB9Cis7CisKK2NsYXNzRGVjbCBbIEFubm90YXRpb25zIGFubm90YXRpb25zIF0gIHJldHVybnMgWyBDbGFzc0RlY2wgcmV0VmFsID0gbnVsbCBdCis6Cit7IEFic3RyYWN0TW9kaWZpZXIgYWJzdHJhY3RNb2RpZmllciA9IG51bGw7IENsYXNzS2luZCBjbGFzc0tpbmQgPSBudWxsOyBUeXBlUGFyYW1zSW5mbyB0eXBlUGFyYW1zSW5mbyA9IG51bGw7IENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBzdXBlclR5cGVzID0gbnVsbDsgQm91bmRFeGNlcHRXaWxkY2FyZCBpbnN0Q2xhc3NOYW1lID0gbnVsbDsgQ2xhc3NNZW1iZXJEZWNscyBjbGFzc01lbWJlckRlY2xzID0gbnVsbDsgfQorICAoIGFic3RyYWN0TW9kaWZpZXI9YWJzdHJhY3RNb2RpZmllciApPyBjbGFzc0tpbmQ9Y2xhc3NLaW5kIG5hbWU6SUQgKCB0eXBlUGFyYW1zSW5mbz10eXBlUGFyYW1zSW5mbyApPyAoIGV4dGVuZHNfS1c6ImV4dGVuZHMiIHN1cGVyVHlwZXM9Y29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkICk/ICggY29sb246Q09MT04gaW5zdENsYXNzTmFtZT1ib3VuZEV4Y2VwdFdpbGRjYXJkICk/IGxjdXJseTpMQ1VSTFkgY2xhc3NNZW1iZXJEZWNscz1jbGFzc01lbWJlckRlY2xzIHJjdXJseTpSQ1VSTFkgCit7IHJldFZhbCA9IG5ldyBDbGFzc0RlY2woYW5ub3RhdGlvbnMsIGFic3RyYWN0TW9kaWZpZXIsIGNsYXNzS2luZCwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCB0eXBlUGFyYW1zSW5mbywgY3JlYXRlVG9rZW5JbmZvKGV4dGVuZHNfS1cpLCBzdXBlclR5cGVzLCBjcmVhdGVUb2tlbkluZm8oY29sb24pLCBpbnN0Q2xhc3NOYW1lLCBjcmVhdGVUb2tlbkluZm8obGN1cmx5KSwgY2xhc3NNZW1iZXJEZWNscywgY3JlYXRlVG9rZW5JbmZvKHJjdXJseSkpOyB9Cis7CisKK2NvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCByZXR1cm5zIFsgQ29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkIHJldFZhbCA9IG5ldyBDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQoKSBdCis6Cit7IEJvdW5kRXhjZXB0V2lsZGNhcmQgdGIxID0gbnVsbDsgQm91bmRFeGNlcHRXaWxkY2FyZCB0Ym4gPSBudWxsOyB9CisgIHRiMT1ib3VuZEV4Y2VwdFdpbGRjYXJkIHsgcmV0VmFsLmFkZENoaWxkKHRiMSk7IH0gCisgICggY29tbWE6Q09NTUEgdGJuPWJvdW5kRXhjZXB0V2lsZGNhcmQgeyByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGNvbW1hKSk7IHJldFZhbC5hZGRDaGlsZCh0Ym4pOyB9ICkqCis7CisKK2Fic3RyYWN0TW9kaWZpZXIgcmV0dXJucyBbIEFic3RyYWN0TW9kaWZpZXIgcmV0VmFsID0gbnVsbCBdCis6CisgIGFic3RyYWN0X0tXOiJhYnN0cmFjdCIgCit7IHJldFZhbCA9IG5ldyBBYnN0cmFjdE1vZGlmaWVyKGNyZWF0ZVRva2VuSW5mbyhhYnN0cmFjdF9LVykpOyB9Cis7CisKK2NsYXNzS2luZCByZXR1cm5zIFsgQ2xhc3NLaW5kIHJldFZhbCA9IG51bGwgXQoreyBUb2tlbiB0b2sgPSBMVCgxKTsgfQorOiAoICJjbGFzcyIKKyAgfCAiaW50ZXJmYWNlIgorICApCit7IHJldFZhbCA9IG5ldyBDbGFzc0tpbmQoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cis7CisKK3R5cGVQYXJhbXNJbmZvIHJldHVybnMgWyBUeXBlUGFyYW1zSW5mbyByZXRWYWwgPSBudWxsIF0KKzoKK3sgT25lT3JNb3JlVHlwZVBhcmFtcyBvbmVPck1vcmVUeXBlUGFyYW1zID0gbnVsbDsgfQorICBsdDpMVCBvbmVPck1vcmVUeXBlUGFyYW1zPW9uZU9yTW9yZVR5cGVQYXJhbXMgZ3Q6R1QgCit7IHJldFZhbCA9IG5ldyBUeXBlUGFyYW1zSW5mbyhjcmVhdGVUb2tlbkluZm8obHQpLCBvbmVPck1vcmVUeXBlUGFyYW1zLCBjcmVhdGVUb2tlbkluZm8oZ3QpKTsgfQorOworCitvbmVPck1vcmVUeXBlUGFyYW1zIHJldHVybnMgWyBPbmVPck1vcmVUeXBlUGFyYW1zIHJldFZhbCA9IG5ldyBPbmVPck1vcmVUeXBlUGFyYW1zKCkgXQorOgoreyBUeXBlUGFyYW0gdHAxID0gbnVsbDsgVHlwZVBhcmFtIHRwbiA9IG51bGw7IH0KKyAgdHAxPXR5cGVQYXJhbSB7IHJldFZhbC5hZGRDaGlsZCh0cDEpOyB9IAorICAoIGNvbW1hOkNPTU1BIHRwbj10eXBlUGFyYW0geyByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGNvbW1hKSk7IHJldFZhbC5hZGRDaGlsZCh0cG4pOyB9ICkqCis7CisKK3R5cGVQYXJhbSByZXR1cm5zIFsgVHlwZVBhcmFtIHJldFZhbCA9IG51bGwgXQorOgoreyBUeXBlQm91bmRzSW5mbyB0eXBlQm91bmRzSW5mbyA9IG51bGw7IH0KKyAgdHlwZVZhck5hbWU6SUQgKCB0eXBlQm91bmRzSW5mbz10eXBlQm91bmRzSW5mbyApPyAKK3sgcmV0VmFsID0gbmV3IFR5cGVQYXJhbShjcmVhdGVUb2tlbkluZm8odHlwZVZhck5hbWUpLCB0eXBlQm91bmRzSW5mbyk7IH0KKzsKKwordHlwZUJvdW5kc0luZm8gcmV0dXJucyBbIFR5cGVCb3VuZHNJbmZvIHJldFZhbCA9IG51bGwgXQorOgoreyBPbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMgb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzID0gbnVsbDsgfQorICBleHRlbmRzX0tXOiJleHRlbmRzIiBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHM9b25lT3JNb3JlVHlwZVBhcmFtQm91bmRzIAoreyByZXRWYWwgPSBuZXcgVHlwZUJvdW5kc0luZm8oY3JlYXRlVG9rZW5JbmZvKGV4dGVuZHNfS1cpLCBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMpOyB9Cis7CisKK29uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyByZXR1cm5zIFsgT25lT3JNb3JlVHlwZVBhcmFtQm91bmRzIHJldFZhbCA9IG5ldyBPbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMoKSBdCis6Cit7IEJvdW5kRXhjZXB0V2lsZGNhcmQgdGIxID0gbnVsbDsgQm91bmRFeGNlcHRXaWxkY2FyZCB0Ym4gPSBudWxsOyB9CisgIHRiMT1ib3VuZEV4Y2VwdFdpbGRjYXJkIHsgcmV0VmFsLmFkZENoaWxkKHRiMSk7IH0gCisgICggYW1wOkFNUCB0Ym49Ym91bmRFeGNlcHRXaWxkY2FyZCB7IHJldFZhbC5hZGRDaGlsZChjcmVhdGVUb2tlbkluZm8oYW1wKSk7IHJldFZhbC5hZGRDaGlsZCh0Ym4pOyB9ICkqCis7CisKK2JvdW5kRXhjZXB0V2lsZGNhcmQgcmV0dXJucyBbIEJvdW5kRXhjZXB0V2lsZGNhcmQgcmV0VmFsID0gbnVsbCBdCis6Cit7IFF1YWxpZmllZElEIHJhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lID0gbnVsbDsgT25lT3JNb3JlVHlwZUFyZ3Mgb25lT3JNb3JlVHlwZUFyZ3MgPSBudWxsOyB9CisgIHJhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lPXF1YWxpZmllZElEICggbHQ6TFQgb25lT3JNb3JlVHlwZUFyZ3M9b25lT3JNb3JlVHlwZUFyZ3MgZ3Q6R1QgKT8gCit7IHJldFZhbCA9IG5ldyBCb3VuZEV4Y2VwdFdpbGRjYXJkKHJhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lLCBjcmVhdGVUb2tlbkluZm8obHQpLCBvbmVPck1vcmVUeXBlQXJncywgY3JlYXRlVG9rZW5JbmZvKGd0KSk7IH0KKzsKKworb25lT3JNb3JlVHlwZUFyZ3MgcmV0dXJucyBbIE9uZU9yTW9yZVR5cGVBcmdzIHJldFZhbCA9IG5ldyBPbmVPck1vcmVUeXBlQXJncygpIF0KKzoKK3sgVHlwZUFyZyB0YTEgPSBudWxsOyBUeXBlQXJnIHRhbiA9IG51bGw7IH0KKyAgdGExPXR5cGVBcmcgeyByZXRWYWwuYWRkQ2hpbGQodGExKTsgfSAKKyAgKCBjb21tYTpDT01NQSB0YW49dHlwZUFyZyB7IHJldFZhbC5hZGRDaGlsZChjcmVhdGVUb2tlbkluZm8oY29tbWEpKTsgcmV0VmFsLmFkZENoaWxkKHRhbik7IH0gKSoKKzsKKwordHlwZUFyZyByZXR1cm5zIFsgVHlwZUFyZyByZXRWYWwgPSBudWxsIF0KKzoKKyAgKCByZXRWYWw9Ym91bmRFeGNlcHRXaWxkY2FyZAorICB8IHJldFZhbD13aWxkY2FyZAorICApCis7CisKK3dpbGRjYXJkIHJldHVybnMgWyBXaWxkY2FyZCByZXRWYWwgPSBudWxsIF0KKzoKK3sgRXh0ZW5kc09yU3VwZXIgZXh0ZW5kc09yU3VwZXIgPSBudWxsOyBCb3VuZEV4Y2VwdFdpbGRjYXJkIGJvdW5kRXhjZXB0V2lsZGNhcmQgPSBudWxsOyB9CisgIHFtYXJrOlFNQVJLICggZXh0ZW5kc09yU3VwZXI9ZXh0ZW5kc09yU3VwZXIgYm91bmRFeGNlcHRXaWxkY2FyZD1ib3VuZEV4Y2VwdFdpbGRjYXJkICk/IAoreyByZXRWYWwgPSBuZXcgV2lsZGNhcmQoY3JlYXRlVG9rZW5JbmZvKHFtYXJrKSwgZXh0ZW5kc09yU3VwZXIsIGJvdW5kRXhjZXB0V2lsZGNhcmQpOyB9Cis7CisKK2V4dGVuZHNPclN1cGVyIHJldHVybnMgWyBFeHRlbmRzT3JTdXBlciByZXRWYWwgPSBudWxsIF0KK3sgVG9rZW4gdG9rID0gTFQoMSk7IH0KKzogKCAiZXh0ZW5kcyIKKyAgfCAic3VwZXIiCisgICkKK3sgcmV0VmFsID0gbmV3IEV4dGVuZHNPclN1cGVyKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorOworCitjbGFzc01lbWJlckRlY2xzIHJldHVybnMgWyBDbGFzc01lbWJlckRlY2xzIHJldFZhbCA9IG5ldyBDbGFzc01lbWJlckRlY2xzKCkgXQorOgoreyBDbGFzc01lbWJlckRlY2wgY2xhc3NNZW1iZXJEZWNsID0gbnVsbDsgfQorICAoIGNsYXNzTWVtYmVyRGVjbD1jbGFzc01lbWJlckRlY2wgeyByZXRWYWwuYWRkQ2hpbGQoY2xhc3NNZW1iZXJEZWNsKTsgfSApKgorOworCitjbGFzc01lbWJlckRlY2wgcmV0dXJucyBbIENsYXNzTWVtYmVyRGVjbCByZXRWYWwgPSBudWxsIF0KKzoKK3sgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgPSBudWxsOyBNb2RpZmllcnMgbW9kaWZpZXJzID0gbnVsbDsgfQorYW5ub3RhdGlvbnM9YW5ub3RhdGlvbnMgbW9kaWZpZXJzPW1vZGlmaWVycyAKKyAgKCByZXRWYWw9YXR0cmlidXRlW2Fubm90YXRpb25zLCBtb2RpZmllcnNdCisgIHwgcmV0VmFsPXJlZmVyZW5jZVthbm5vdGF0aW9ucywgbW9kaWZpZXJzXQorICB8IHJldFZhbD1vcGVyYXRpb25bYW5ub3RhdGlvbnMsIG1vZGlmaWVyc10KKyAgKQorOworCithdHRyaWJ1dGUgWyBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucywgTW9kaWZpZXJzIG1vZGlmaWVycyBdICByZXR1cm5zIFsgQXR0cmlidXRlIHJldFZhbCA9IG51bGwgXQorOgoreyBUeXBlV2l0aE11bHRpIHR5cGVXaXRoTXVsdGkgPSBudWxsOyBEZWZhdWx0VmFsdWVFeHByIGRlZmF1bHRWYWx1ZUV4cHIgPSBudWxsOyB9CisgIGF0dHJfS1c6ImF0dHIiIHR5cGVXaXRoTXVsdGk9dHlwZVdpdGhNdWx0aSBuYW1lOklEICggZXF1YWxzOkVRVUFMUyBkZWZhdWx0VmFsdWVFeHByPWRlZmF1bHRWYWx1ZUV4cHIgKT8gc2VtaTpTRU1JIAoreyByZXRWYWwgPSBuZXcgQXR0cmlidXRlKGFubm90YXRpb25zLCBtb2RpZmllcnMsIGNyZWF0ZVRva2VuSW5mbyhhdHRyX0tXKSwgdHlwZVdpdGhNdWx0aSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgZGVmYXVsdFZhbHVlRXhwciwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsgfQorOworCit0eXBlV2l0aE11bHRpIHJldHVybnMgWyBUeXBlV2l0aE11bHRpIHJldFZhbCA9IG51bGwgXQorOgoreyBCb3VuZEV4Y2VwdFdpbGRjYXJkIG5hbWUgPSBudWxsOyBNdWx0aXBsaWNpdHkgbXVsdGlwbGljaXR5ID0gbnVsbDsgfQorICBuYW1lPWJvdW5kRXhjZXB0V2lsZGNhcmQgKCBtdWx0aXBsaWNpdHk9bXVsdGlwbGljaXR5ICk/IAoreyByZXRWYWwgPSBuZXcgVHlwZVdpdGhNdWx0aShuYW1lLCBtdWx0aXBsaWNpdHkpOyB9Cis7CisKK211bHRpcGxpY2l0eSByZXR1cm5zIFsgTXVsdGlwbGljaXR5IHJldFZhbCA9IG51bGwgXQorOgoreyBNdWx0aXBsaWNpdHlFeHByIG11bHRpcGxpY2l0eUV4cHIgPSBudWxsOyB9CisgIGxzcXVhcmU6TFNRVUFSRSAoIG11bHRpcGxpY2l0eUV4cHI9bXVsdGlwbGljaXR5RXhwciApPyByc3F1YXJlOlJTUVVBUkUgCit7IHJldFZhbCA9IG5ldyBNdWx0aXBsaWNpdHkoY3JlYXRlVG9rZW5JbmZvKGxzcXVhcmUpLCBtdWx0aXBsaWNpdHlFeHByLCBjcmVhdGVUb2tlbkluZm8ocnNxdWFyZSkpOyB9Cis7CisKK211bHRpcGxpY2l0eUV4cHIgcmV0dXJucyBbIE11bHRpcGxpY2l0eUV4cHIgcmV0VmFsID0gbnVsbCBdCis6Cit7IFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgbG93ZXJCb3VuZCA9IG51bGw7IFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgdXBwZXJCb3VuZCA9IG51bGw7IH0KKyAgbG93ZXJCb3VuZD1zaW1wbGVNdWx0aXBsaWNpdHlFeHByICggZG90X2RvdDpET1RfRE9UIHVwcGVyQm91bmQ9c2ltcGxlTXVsdGlwbGljaXR5RXhwciApPyAKK3sgcmV0VmFsID0gbmV3IE11bHRpcGxpY2l0eUV4cHIobG93ZXJCb3VuZCwgY3JlYXRlVG9rZW5JbmZvKGRvdF9kb3QpLCB1cHBlckJvdW5kKTsgfQorOworCitzaW1wbGVNdWx0aXBsaWNpdHlFeHByIHJldHVybnMgWyBTaW1wbGVNdWx0aXBsaWNpdHlFeHByIHJldFZhbCA9IG51bGwgXQoreyBUb2tlbiB0b2sgPSBMVCgxKTsgfQorOiAoIFNUQVIKKyAgfCBQTFVTCisgIHwgUU1BUksKKyAgfCBJTlRfTElURVJBTAorICApCit7IHJldFZhbCA9IG5ldyBTaW1wbGVNdWx0aXBsaWNpdHlFeHByKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorOworCityZWZlcmVuY2UgWyBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucywgTW9kaWZpZXJzIG1vZGlmaWVycyBdICByZXR1cm5zIFsgUmVmZXJlbmNlIHJldFZhbCA9IG51bGwgXQorOgoreyBSZWZlcmVuY2VLaW5kIHJlZmVyZW5jZUtpbmQgPSBudWxsOyBUeXBlV2l0aE11bHRpIHR5cGVXaXRoTXVsdGkgPSBudWxsOyB9CisgIHJlZmVyZW5jZUtpbmQ9cmVmZXJlbmNlS2luZCB0eXBlV2l0aE11bHRpPXR5cGVXaXRoTXVsdGkgKCBoYXNoOkhBU0ggb3Bwb3NpdGVOYW1lOklEICk/IG5hbWU6SUQgc2VtaTpTRU1JIAoreyByZXRWYWwgPSBuZXcgUmVmZXJlbmNlKGFubm90YXRpb25zLCBtb2RpZmllcnMsIHJlZmVyZW5jZUtpbmQsIHR5cGVXaXRoTXVsdGksIGNyZWF0ZVRva2VuSW5mbyhoYXNoKSwgY3JlYXRlVG9rZW5JbmZvKG9wcG9zaXRlTmFtZSksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsgfQorOworCityZWZlcmVuY2VLaW5kIHJldHVybnMgWyBSZWZlcmVuY2VLaW5kIHJldFZhbCA9IG51bGwgXQoreyBUb2tlbiB0b2sgPSBMVCgxKTsgfQorOiAoICJyZWYiCisgIHwgInZhbCIKKyAgKQoreyByZXRWYWwgPSBuZXcgUmVmZXJlbmNlS2luZChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KKzsKKworbW9kaWZpZXJzIHJldHVybnMgWyBNb2RpZmllcnMgcmV0VmFsID0gbmV3IE1vZGlmaWVycygpIF0KKzoKK3sgT3B0TmVnYXRlZE1vZGlmaWVyIG9wdE5lZ2F0ZWRNb2RpZmllciA9IG51bGw7IH0KKyAgKCBvcHROZWdhdGVkTW9kaWZpZXI9b3B0TmVnYXRlZE1vZGlmaWVyIHsgcmV0VmFsLmFkZENoaWxkKG9wdE5lZ2F0ZWRNb2RpZmllcik7IH0gKSoKKzsKKworb3B0TmVnYXRlZE1vZGlmaWVyIHJldHVybnMgWyBPcHROZWdhdGVkTW9kaWZpZXIgcmV0VmFsID0gbnVsbCBdCis6Cit7IE1vZGlmaWVyIG1vZGlmaWVyID0gbnVsbDsgfQorICAoIGJhbmc6QkFORyApPyBtb2RpZmllcj1tb2RpZmllciAKK3sgcmV0VmFsID0gbmV3IE9wdE5lZ2F0ZWRNb2RpZmllcihjcmVhdGVUb2tlbkluZm8oYmFuZyksIG1vZGlmaWVyKTsgfQorOworCittb2RpZmllciByZXR1cm5zIFsgTW9kaWZpZXIgcmV0VmFsID0gbnVsbCBdCit7IFRva2VuIHRvayA9IExUKDEpOyB9Cis6ICggInJlYWRvbmx5IgorICB8ICJ2b2xhdGlsZSIKKyAgfCAidHJhbnNpZW50IgorICB8ICJ1bnNldHRhYmxlIgorICB8ICJkZXJpdmVkIgorICB8ICJ1bmlxdWUiCisgIHwgIm9yZGVyZWQiCisgIHwgInJlc29sdmUiCisgIHwgImlkIgorICApCit7IHJldFZhbCA9IG5ldyBNb2RpZmllcihjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KKzsKKworZGVmYXVsdFZhbHVlRXhwciByZXR1cm5zIFsgRGVmYXVsdFZhbHVlRXhwciByZXRWYWwgPSBudWxsIF0KKzoKKyAgKCByZXRWYWw9Ym9vbEV4cHIKKyAgfCByZXRWYWw9aW50RXhwcgorICB8IHJldFZhbD1zdHJpbmdFeHByCisgIHwgcmV0VmFsPWNoYXJFeHByCisgICkKKzsKKworYm9vbEV4cHIgcmV0dXJucyBbIEJvb2xFeHByIHJldFZhbCA9IG51bGwgXQorOgoreyBUcnVlT3JGYWxzZSB0cnVlT3JGYWxzZSA9IG51bGw7IH0KKyAgdHJ1ZU9yRmFsc2U9dHJ1ZU9yRmFsc2UgCit7IHJldFZhbCA9IG5ldyBCb29sRXhwcih0cnVlT3JGYWxzZSk7IH0KKzsKKwordHJ1ZU9yRmFsc2UgcmV0dXJucyBbIFRydWVPckZhbHNlIHJldFZhbCA9IG51bGwgXQoreyBUb2tlbiB0b2sgPSBMVCgxKTsgfQorOiAoICJ0cnVlIgorICB8ICJmYWxzZSIKKyAgKQoreyByZXRWYWwgPSBuZXcgVHJ1ZU9yRmFsc2UoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cis7CisKK2ludEV4cHIgcmV0dXJucyBbIEludEV4cHIgcmV0VmFsID0gbnVsbCBdCis6CisgICggbWludXM6TUlOVVMgKT8gaW50X2xpdGVyYWw6SU5UX0xJVEVSQUwgCit7IHJldFZhbCA9IG5ldyBJbnRFeHByKGNyZWF0ZVRva2VuSW5mbyhtaW51cyksIGNyZWF0ZVRva2VuSW5mbyhpbnRfbGl0ZXJhbCkpOyB9Cis7CisKK3N0cmluZ0V4cHIgcmV0dXJucyBbIFN0cmluZ0V4cHIgcmV0VmFsID0gbnVsbCBdCis6CisgIHN0cmluZ19saXRlcmFsOlNUUklOR19MSVRFUkFMIAoreyByZXRWYWwgPSBuZXcgU3RyaW5nRXhwcihjcmVhdGVUb2tlbkluZm8oc3RyaW5nX2xpdGVyYWwpKTsgfQorOworCitjaGFyRXhwciByZXR1cm5zIFsgQ2hhckV4cHIgcmV0VmFsID0gbnVsbCBdCis6CisgIGNoYXJfbGl0ZXJhbDpDSEFSX0xJVEVSQUwgCit7IHJldFZhbCA9IG5ldyBDaGFyRXhwcihjcmVhdGVUb2tlbkluZm8oY2hhcl9saXRlcmFsKSk7IH0KKzsKKworb3BlcmF0aW9uIFsgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMsIE1vZGlmaWVycyBtb2RpZmllcnMgXSAgcmV0dXJucyBbIE9wZXJhdGlvbiByZXRWYWwgPSBudWxsIF0KKzoKK3sgVHlwZVBhcmFtc0luZm8gdHlwZVBhcmFtc0luZm8gPSBudWxsOyBSZXN1bHRUeXBlIHJlc1R5cGUgPSBudWxsOyBQYXJhbXMgcGFyYW1zID0gbnVsbDsgQ29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkIGV4Y2VwdGlvbnMgPSBudWxsOyB9CisgIG9wX0tXOiJvcCIgKCB0eXBlUGFyYW1zSW5mbz10eXBlUGFyYW1zSW5mbyApPyByZXNUeXBlPXJlc3VsdFR5cGUgbmFtZTpJRCBscGFyZW46TFBBUkVOICggcGFyYW1zPXBhcmFtcyApPyBycGFyZW46UlBBUkVOICggdGhyb3dzX0tXOiJ0aHJvd3MiIGV4Y2VwdGlvbnM9Y29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkICk/IHNlbWk6U0VNSSAKK3sgcmV0VmFsID0gbmV3IE9wZXJhdGlvbihhbm5vdGF0aW9ucywgbW9kaWZpZXJzLCBjcmVhdGVUb2tlbkluZm8ob3BfS1cpLCB0eXBlUGFyYW1zSW5mbywgcmVzVHlwZSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8obHBhcmVuKSwgcGFyYW1zLCBjcmVhdGVUb2tlbkluZm8ocnBhcmVuKSwgY3JlYXRlVG9rZW5JbmZvKHRocm93c19LVyksIGV4Y2VwdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7IH0KKzsKKworcmVzdWx0VHlwZSByZXR1cm5zIFsgUmVzdWx0VHlwZSByZXRWYWwgPSBudWxsIF0KKzoKKyAgKCByZXRWYWw9dHlwZVdpdGhNdWx0aQorICB8IHJldFZhbD12b2lkQ29udGFpbmVyCisgICkKKzsKKwordm9pZENvbnRhaW5lciByZXR1cm5zIFsgVm9pZENvbnRhaW5lciByZXRWYWwgPSBudWxsIF0KKzoKKyAgdm9pZF9LVzoidm9pZCIgCit7IHJldFZhbCA9IG5ldyBWb2lkQ29udGFpbmVyKGNyZWF0ZVRva2VuSW5mbyh2b2lkX0tXKSk7IH0KKzsKKworcGFyYW1zIHJldHVybnMgWyBQYXJhbXMgcmV0VmFsID0gbmV3IFBhcmFtcygpIF0KKzoKK3sgUGFyYW0gcDEgPSBudWxsOyBQYXJhbSBwbiA9IG51bGw7IH0KKyAgcDE9cGFyYW0geyByZXRWYWwuYWRkQ2hpbGQocDEpOyB9IAorICAoIGNvbW1hOkNPTU1BIHBuPXBhcmFtIHsgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhjb21tYSkpOyByZXRWYWwuYWRkQ2hpbGQocG4pOyB9ICkqCis7CisKK3BhcmFtIHJldHVybnMgWyBQYXJhbSByZXRWYWwgPSBudWxsIF0KKzoKK3sgQW5ub3RhdGlvbnMgbGVhZGluZ0Fubm90YXRpb25zID0gbnVsbDsgTW9kaWZpZXJzIG1vZGlmaWVycyA9IG51bGw7IFR5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSA9IG51bGw7IEFubm90YXRpb25zIHRyYWlsaW5nQW5ub3RhdGlvbnMgPSBudWxsOyB9CisgIGxlYWRpbmdBbm5vdGF0aW9ucz1hbm5vdGF0aW9ucyBtb2RpZmllcnM9bW9kaWZpZXJzIHR5cGVXaXRoTXVsdGk9dHlwZVdpdGhNdWx0aSBuYW1lOklEIHRyYWlsaW5nQW5ub3RhdGlvbnM9YW5ub3RhdGlvbnMgCit7IHJldFZhbCA9IG5ldyBQYXJhbShsZWFkaW5nQW5ub3RhdGlvbnMsIG1vZGlmaWVycywgdHlwZVdpdGhNdWx0aSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCB0cmFpbGluZ0Fubm90YXRpb25zKTsgfQorOworCitkYXRhVHlwZURlY2wgWyBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyBdICByZXR1cm5zIFsgRGF0YVR5cGVEZWNsIHJldFZhbCA9IG51bGwgXQorOgoreyBUcmFuc2llbnRNb2RpZmllciB0cmFuc2llbnRNb2RpZmllciA9IG51bGw7IFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIGluc3RDbGFzc05hbWUgPSBudWxsOyB9CisgICggdHJhbnNpZW50TW9kaWZpZXI9dHJhbnNpZW50TW9kaWZpZXIgKT8gZGF0YXR5cGVfS1c6ImRhdGF0eXBlIiBuYW1lOklEIGNvbG9uOkNPTE9OIGluc3RDbGFzc05hbWU9c3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgc2VtaTpTRU1JIAoreyByZXRWYWwgPSBuZXcgRGF0YVR5cGVEZWNsKGFubm90YXRpb25zLCB0cmFuc2llbnRNb2RpZmllciwgY3JlYXRlVG9rZW5JbmZvKGRhdGF0eXBlX0tXKSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oY29sb24pLCBpbnN0Q2xhc3NOYW1lLCBjcmVhdGVUb2tlbkluZm8oc2VtaSkpOyB9Cis7CisKK3RyYW5zaWVudE1vZGlmaWVyIHJldHVybnMgWyBUcmFuc2llbnRNb2RpZmllciByZXRWYWwgPSBudWxsIF0KKzoKKyAgdHJhbnNpZW50X0tXOiJ0cmFuc2llbnQiIAoreyByZXRWYWwgPSBuZXcgVHJhbnNpZW50TW9kaWZpZXIoY3JlYXRlVG9rZW5JbmZvKHRyYW5zaWVudF9LVykpOyB9Cis7CisKK2VudW1EZWNsIFsgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgXSAgcmV0dXJucyBbIEVudW1EZWNsIHJldFZhbCA9IG51bGwgXQorOgoreyBFbnVtTGl0ZXJhbHMgZW51bUxpdGVyYWxzID0gbnVsbDsgfQorICBlbnVtX0tXOiJlbnVtIiBuYW1lOklEIGxjdXJseTpMQ1VSTFkgZW51bUxpdGVyYWxzPWVudW1MaXRlcmFscyByY3VybHk6UkNVUkxZIAoreyByZXRWYWwgPSBuZXcgRW51bURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhlbnVtX0tXKSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8obGN1cmx5KSwgZW51bUxpdGVyYWxzLCBjcmVhdGVUb2tlbkluZm8ocmN1cmx5KSk7IH0KKzsKKworZW51bUxpdGVyYWxzIHJldHVybnMgWyBFbnVtTGl0ZXJhbHMgcmV0VmFsID0gbmV3IEVudW1MaXRlcmFscygpIF0KKzoKK3sgRW51bUxpdGVyYWwgZW51bUxpdGVyYWwgPSBudWxsOyB9CisgICggZW51bUxpdGVyYWw9ZW51bUxpdGVyYWwgeyByZXRWYWwuYWRkQ2hpbGQoZW51bUxpdGVyYWwpOyB9ICkqCis7CisKK2VudW1MaXRlcmFsIHJldHVybnMgWyBFbnVtTGl0ZXJhbCByZXRWYWwgPSBudWxsIF0KKzoKK3sgQW5ub3RhdGlvbnMgbGVhZGluZ0Fubm90YXRpb25zID0gbnVsbDsgQW5ub3RhdGlvbnMgdHJhaWxpbmdBbm5vdGF0aW9ucyA9IG51bGw7IH0KKyAgbGVhZGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zIG5hbWU6SUQgKCBlcXVhbHM6RVFVQUxTIHZhbDpJTlRfTElURVJBTCApPyB0cmFpbGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zIHNlbWk6U0VNSSAKK3sgcmV0VmFsID0gbmV3IEVudW1MaXRlcmFsKGxlYWRpbmdBbm5vdGF0aW9ucywgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgY3JlYXRlVG9rZW5JbmZvKHZhbCksIHRyYWlsaW5nQW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7IH0KKzsKKworbWFwRW50cnlEZWNsIFsgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgXSAgcmV0dXJucyBbIE1hcEVudHJ5RGVjbCByZXRWYWwgPSBudWxsIF0KKzoKK3sgVHlwZVdpdGhNdWx0aSBrZXkgPSBudWxsOyBUeXBlV2l0aE11bHRpIHZhbHVlID0gbnVsbDsgfQorICBtYXBlbnRyeV9LVzoibWFwZW50cnkiIG5hbWU6SUQgY29sb246Q09MT04ga2V5PXR5cGVXaXRoTXVsdGkgbWludXNfZ3Q6TUlOVVNfR1QgdmFsdWU9dHlwZVdpdGhNdWx0aSBzZW1pOlNFTUkgCit7IHJldFZhbCA9IG5ldyBNYXBFbnRyeURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhtYXBlbnRyeV9LVyksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGNvbG9uKSwga2V5LCBjcmVhdGVUb2tlbkluZm8obWludXNfZ3QpLCB2YWx1ZSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsgfQorOworCisKK2NsYXNzIEVtZmF0aWNMZXhlciBleHRlbmRzIExleGVyOworCitvcHRpb25zCit7CisJdGVzdExpdGVyYWxzPWZhbHNlOworCWs9MzsKKwkvLyBjaGFyVm9jYWJ1bGFyeT0nXDAwMycuLidcMzc3JzsKKwljaGFyVm9jYWJ1bGFyeT0nXHUwMDAwJy4uJ1x1RkZGRSc7Cit9CisKKworTENVUkxZICA6ICd7JzsKK1JDVVJMWSAgOiAnfSc7CitMU1FVQVJFIDogJ1snOworUlNRVUFSRSA6ICddJzsKK0xQQVJFTiAgOiAnKCc7CitSUEFSRU4gIDogJyknOworCitET1QgICAgIDogJy4nOworQ09NTUEgICA6ICcsJzsKK0NPTE9OICAgOiAnOic7CitTRU1JICAgIDogJzsnOworCitTVEFSICAgIDogJyonOworUExVUyAgICA6ICcrJzsKK01JTlVTICAgOiAnLSc7CitFUVVBTFMgIDogJz0nOworCitRTUFSSyAgIDogJz8nOworQkFORyAgICA6ICchJzsKK0RPTExBUiAgOiAnJCc7CitIQVNIICAgIDogJyMnOworQVQgICAgICA6ICdAJzsKKworRE9UX0RPVCAgOiAiLi4iOworTUlOVVNfR1QgOiAiLT4iOworR1RfTFQgICAgOiAiPjwiOworTFRfR1QgICAgOiAiPD4iOworCitTVFJJTkdfTElURVJBTCA6ICciJyAoRVNDIHwgficiJykqICciJyA7CitDSEFSX0xJVEVSQUwgICA6ICdcJycgKEVTQyB8IH4nXCcnKSAnXCcnOworCisvLyBUT0RPOiBUaGUgKERJR0lUIERJR0lUIERJR0lUKSBpcyBjaGVlc3kgaXQgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlCisvLyAgICAgICAoIG9wdGlvbnMgeyB3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7IH0gOiAoRElHSVQpKyApCisvLyAgICAgICBidXQgSSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCBwYXJzaW5nIHRoYXQgeWV0LgorcHJvdGVjdGVkIEVTQyA6CisnXFwnICgndCcgfCAnZicgfCAncicgfCAnbicgfCAnIicgfCAnXCcnIHwgJ1xcJyB8IChESUdJVCBESUdJVCBESUdJVCkgKQorOworCitJRCBvcHRpb25zIHsgdGVzdExpdGVyYWxzPXRydWU7IH0KKzogKCd+Jyk/ICgnYScuLid6JyB8ICdBJy4uJ1onIHwgJ18nKSAoJ2EnLi4neicgfCAnQScuLidaJyB8ICdfJyB8IERJR0lUKSogOworCitJTlRfTElURVJBTCA6IChESUdJVCkrIDsKKworcHJvdGVjdGVkIERJR0lUIDogJzAnLi4nOSc7CisKK1dTIDogKCcgJyB8ICdcdCcgfCAnXGYnIHwgJ1xyJyB8ICdcbicpKyAKK3sgJHNldFR5cGUoVG9rZW4uU0tJUCk7IH0KKzsKKworU0lOR0xFX0xJTkVfQ09NTUVOVCA6ICIvLyIgKH4oJ1xuJ3wnXHInKSkqICgnXG4nfCdccicpPworeyAkc2V0VHlwZShUb2tlbi5TS0lQKTsgfQorOworCitNVUxUSV9MSU5FX0NPTU1FTlQgOiAiLyoiICgiKi8iIHwgKH4nIScgKH4nKicgfCAnKicgficvJykqICIqLyIpKQoreyAkc2V0VHlwZShUb2tlbi5TS0lQKTsgfQorOworCitBTVA6ICcmJzsKK0xUOic8JzsKK0dUOic+JzsKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvQU5UTFJ2MnBhcnNlci9FbWZhdGljTGV4ZXIuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0FOVExSdjJwYXJzZXIvRW1mYXRpY0xleGVyLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzZmVjNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0FOVExSdjJwYXJzZXIvRW1mYXRpY0xleGVyLmcKQEAgLTAsMCArMSw3MiBAQAorY2xhc3MgRW1mYXRpY0xleGVyIGV4dGVuZHMgTGV4ZXI7CisKK29wdGlvbnMKK3sKKwl0ZXN0TGl0ZXJhbHM9ZmFsc2U7CisJaz0zOworCS8vIGNoYXJWb2NhYnVsYXJ5PSdcMDAzJy4uJ1wzNzcnOworCWNoYXJWb2NhYnVsYXJ5PSdcdTAwMDAnLi4nXHVGRkZFJzsKK30KKworCitMQ1VSTFkgIDogJ3snOworUkNVUkxZICA6ICd9JzsKK0xTUVVBUkUgOiAnWyc7CitSU1FVQVJFIDogJ10nOworTFBBUkVOICA6ICcoJzsKK1JQQVJFTiAgOiAnKSc7CisKK0RPVCAgICAgOiAnLic7CitDT01NQSAgIDogJywnOworQ09MT04gICA6ICc6JzsKK1NFTUkgICAgOiAnOyc7CisKK1NUQVIgICAgOiAnKic7CitQTFVTICAgIDogJysnOworTUlOVVMgICA6ICctJzsKK0VRVUFMUyAgOiAnPSc7CisKK1FNQVJLICAgOiAnPyc7CitCQU5HICAgIDogJyEnOworRE9MTEFSICA6ICckJzsKK0hBU0ggICAgOiAnIyc7CitBVCAgICAgIDogJ0AnOworCitET1RfRE9UICA6ICIuLiI7CitNSU5VU19HVCA6ICItPiI7CitHVF9MVCAgICA6ICI+PCI7CitMVF9HVCAgICA6ICI8PiI7CisKK1NUUklOR19MSVRFUkFMIDogJyInIChFU0MgfCB+JyInKSogJyInIDsKK0NIQVJfTElURVJBTCAgIDogJ1wnJyAoRVNDIHwgfidcJycpICdcJyc7CisKKy8vIFRPRE86IFRoZSAoRElHSVQgRElHSVQgRElHSVQpIGlzIGNoZWVzeSBpdCBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UKKy8vICAgICAgICggb3B0aW9ucyB7IHdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsgfSA6IChESUdJVCkrICkKKy8vICAgICAgIGJ1dCBJIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIHBhcnNpbmcgdGhhdCB5ZXQuCitwcm90ZWN0ZWQgRVNDIDoKKydcXCcgKCd0JyB8ICdmJyB8ICdyJyB8ICduJyB8ICciJyB8ICdcJycgfCAnXFwnIHwgKERJR0lUIERJR0lUIERJR0lUKSApCis7CisKK0lEIG9wdGlvbnMgeyB0ZXN0TGl0ZXJhbHM9dHJ1ZTsgfQorOiAoJ34nKT8gKCdhJy4uJ3onIHwgJ0EnLi4nWicgfCAnXycpICgnYScuLid6JyB8ICdBJy4uJ1onIHwgJ18nIHwgRElHSVQpKiA7CisKK0lOVF9MSVRFUkFMIDogKERJR0lUKSsgOworCitwcm90ZWN0ZWQgRElHSVQgOiAnMCcuLic5JzsKKworV1MgOiAoJyAnIHwgJ1x0JyB8ICdcZicgfCAnXHInIHwgJ1xuJykrIAoreyAkc2V0VHlwZShUb2tlbi5TS0lQKTsgfQorOworCitTSU5HTEVfTElORV9DT01NRU5UIDogIi8vIiAofignXG4nfCdccicpKSogKCdcbid8J1xyJyk/Cit7ICRzZXRUeXBlKFRva2VuLlNLSVApOyB9Cis7CisKK01VTFRJX0xJTkVfQ09NTUVOVCA6ICIvKiIgKCIqLyIgfCAofichJyAoficqJyB8ICcqJyB+Jy8nKSogIiovIikpCit7ICRzZXRUeXBlKFRva2VuLlNLSVApOyB9Cis7CisKK0FNUDogJyYnOworTFQ6JzwnOworR1Q6Jz4nOworCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9BTlRMUnYycGFyc2VyL0VtZmF0aWNMZXhlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvQU5UTFJ2MnBhcnNlci9FbWZhdGljTGV4ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTlkMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvQU5UTFJ2MnBhcnNlci9FbWZhdGljTGV4ZXIuamF2YQpAQCAtMCwwICsxLDExMjIgQEAKKy8vICRBTlRMUiA6ICJFbWZhdGljLmciIC0+ICJFbWZhdGljTGV4ZXIuamF2YSIkCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5wYXJzZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuKjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgYW50bHIuVG9rZW5TdHJlYW1FeGNlcHRpb247CitpbXBvcnQgYW50bHIuVG9rZW5TdHJlYW1JT0V4Y2VwdGlvbjsKK2ltcG9ydCBhbnRsci5Ub2tlblN0cmVhbVJlY29nbml0aW9uRXhjZXB0aW9uOworaW1wb3J0IGFudGxyLkNoYXJTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgYW50bHIuQ2hhclN0cmVhbUlPRXhjZXB0aW9uOworaW1wb3J0IGFudGxyLkFOVExSRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgYW50bHIuQ2hhclNjYW5uZXI7CitpbXBvcnQgYW50bHIuSW5wdXRCdWZmZXI7CitpbXBvcnQgYW50bHIuQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBhbnRsci5DaGFyQnVmZmVyOworaW1wb3J0IGFudGxyLlRva2VuOworaW1wb3J0IGFudGxyLkNvbW1vblRva2VuOworaW1wb3J0IGFudGxyLlJlY29nbml0aW9uRXhjZXB0aW9uOworaW1wb3J0IGFudGxyLk5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbjsKK2ltcG9ydCBhbnRsci5NaXNtYXRjaGVkQ2hhckV4Y2VwdGlvbjsKK2ltcG9ydCBhbnRsci5Ub2tlblN0cmVhbTsKK2ltcG9ydCBhbnRsci5BTlRMUkhhc2hTdHJpbmc7CitpbXBvcnQgYW50bHIuTGV4ZXJTaGFyZWRJbnB1dFN0YXRlOworaW1wb3J0IGFudGxyLmNvbGxlY3Rpb25zLmltcGwuQml0U2V0OworaW1wb3J0IGFudGxyLlNlbWFudGljRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY0xleGVyIGV4dGVuZHMgYW50bHIuQ2hhclNjYW5uZXIgaW1wbGVtZW50cyBFbWZhdGljUGFyc2VyVG9rZW5UeXBlcywgVG9rZW5TdHJlYW0KKyB7CitwdWJsaWMgRW1mYXRpY0xleGVyKElucHV0U3RyZWFtIGluKSB7CisJdGhpcyhuZXcgQnl0ZUJ1ZmZlcihpbikpOworfQorcHVibGljIEVtZmF0aWNMZXhlcihSZWFkZXIgaW4pIHsKKwl0aGlzKG5ldyBDaGFyQnVmZmVyKGluKSk7Cit9CitwdWJsaWMgRW1mYXRpY0xleGVyKElucHV0QnVmZmVyIGliKSB7CisJdGhpcyhuZXcgTGV4ZXJTaGFyZWRJbnB1dFN0YXRlKGliKSk7Cit9CitwdWJsaWMgRW1mYXRpY0xleGVyKExleGVyU2hhcmVkSW5wdXRTdGF0ZSBzdGF0ZSkgeworCXN1cGVyKHN0YXRlKTsKKwljYXNlU2Vuc2l0aXZlTGl0ZXJhbHMgPSB0cnVlOworCXNldENhc2VTZW5zaXRpdmUodHJ1ZSk7CisJbGl0ZXJhbHMgPSBuZXcgSGFzaHRhYmxlKCk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInN1cGVyIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDI3KSk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImFic3RyYWN0IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDIwKSk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInJlZiIsIHRoaXMpLCBuZXcgSW50ZWdlcigzNikpOworCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJ1bnNldHRhYmxlIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQyKSk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoIm9wIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDUyKSk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImRhdGF0eXBlIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDU1KSk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImNsYXNzIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDIxKSk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInZhbCIsIHRoaXMpLCBuZXcgSW50ZWdlcigzNykpOworCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJ0aHJvd3MiLCB0aGlzKSwgbmV3IEludGVnZXIoNTMpKTsKKwlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiZGVyaXZlZCIsIHRoaXMpLCBuZXcgSW50ZWdlcig0MykpOworCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJ0cmFuc2llbnQiLCB0aGlzKSwgbmV3IEludGVnZXIoNDEpKTsKKwlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidW5pcXVlIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQ0KSk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoIm9yZGVyZWQiLCB0aGlzKSwgbmV3IEludGVnZXIoNDUpKTsKKwlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiZW51bSIsIHRoaXMpLCBuZXcgSW50ZWdlcig1NikpOworCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJleHRlbmRzIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDE4KSk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImF0dHIiLCB0aGlzKSwgbmV3IEludGVnZXIoMjgpKTsKKwlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidm9pZCIsIHRoaXMpLCBuZXcgSW50ZWdlcig1NCkpOworCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJpbXBvcnQiLCB0aGlzKSwgbmV3IEludGVnZXIoMTUpKTsKKwlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidHJ1ZSIsIHRoaXMpLCBuZXcgSW50ZWdlcig0OCkpOworCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJpbnRlcmZhY2UiLCB0aGlzKSwgbmV3IEludGVnZXIoMjIpKTsKKwlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiaWQiLCB0aGlzKSwgbmV3IEludGVnZXIoNDcpKTsKKwlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygicmVhZG9ubHkiLCB0aGlzKSwgbmV3IEludGVnZXIoMzkpKTsKKwlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygicGFja2FnZSIsIHRoaXMpLCBuZXcgSW50ZWdlcig0KSk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImZhbHNlIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQ5KSk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInZvbGF0aWxlIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQwKSk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoIm1hcGVudHJ5IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDU3KSk7CisJbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInJlc29sdmUiLCB0aGlzKSwgbmV3IEludGVnZXIoNDYpKTsKK30KKworcHVibGljIFRva2VuIG5leHRUb2tlbigpIHRocm93cyBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJVG9rZW4gdGhlUmV0VG9rZW49bnVsbDsKK3RyeUFnYWluOgorCWZvciAoOzspIHsKKwkJVG9rZW4gX3Rva2VuID0gbnVsbDsKKwkJaW50IF90dHlwZSA9IFRva2VuLklOVkFMSURfVFlQRTsKKwkJcmVzZXRUZXh0KCk7CisJCXRyeSB7ICAgLy8gZm9yIGNoYXIgc3RyZWFtIGVycm9yIGhhbmRsaW5nCisJCQl0cnkgeyAgIC8vIGZvciBsZXhpY2FsIGVycm9yIGhhbmRsaW5nCisJCQkJc3dpdGNoICggTEEoMSkpIHsKKwkJCQljYXNlICd7JzoKKwkJCQl7CisJCQkJCW1MQ1VSTFkodHJ1ZSk7CisJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgJ30nOgorCQkJCXsKKwkJCQkJbVJDVVJMWSh0cnVlKTsKKwkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSAnWyc6CisJCQkJeworCQkJCQltTFNRVUFSRSh0cnVlKTsKKwkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSAnXSc6CisJCQkJeworCQkJCQltUlNRVUFSRSh0cnVlKTsKKwkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSAnKCc6CisJCQkJeworCQkJCQltTFBBUkVOKHRydWUpOworCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlICcpJzoKKwkJCQl7CisJCQkJCW1SUEFSRU4odHJ1ZSk7CisJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgJywnOgorCQkJCXsKKwkJCQkJbUNPTU1BKHRydWUpOworCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlICc6JzoKKwkJCQl7CisJCQkJCW1DT0xPTih0cnVlKTsKKwkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSAnOyc6CisJCQkJeworCQkJCQltU0VNSSh0cnVlKTsKKwkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSAnKic6CisJCQkJeworCQkJCQltU1RBUih0cnVlKTsKKwkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSAnKyc6CisJCQkJeworCQkJCQltUExVUyh0cnVlKTsKKwkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSAnPSc6CisJCQkJeworCQkJCQltRVFVQUxTKHRydWUpOworCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlICc/JzoKKwkJCQl7CisJCQkJCW1RTUFSSyh0cnVlKTsKKwkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSAnISc6CisJCQkJeworCQkJCQltQkFORyh0cnVlKTsKKwkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSAnJCc6CisJCQkJeworCQkJCQltRE9MTEFSKHRydWUpOworCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlICcjJzoKKwkJCQl7CisJCQkJCW1IQVNIKHRydWUpOworCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlICdAJzoKKwkJCQl7CisJCQkJCW1BVCh0cnVlKTsKKwkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSAnIic6CisJCQkJeworCQkJCQltU1RSSU5HX0xJVEVSQUwodHJ1ZSk7CisJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgJ1wnJzoKKwkJCQl7CisJCQkJCW1DSEFSX0xJVEVSQUwodHJ1ZSk7CisJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgJ0EnOiAgY2FzZSAnQic6ICBjYXNlICdDJzogIGNhc2UgJ0QnOgorCQkJCWNhc2UgJ0UnOiAgY2FzZSAnRic6ICBjYXNlICdHJzogIGNhc2UgJ0gnOgorCQkJCWNhc2UgJ0knOiAgY2FzZSAnSic6ICBjYXNlICdLJzogIGNhc2UgJ0wnOgorCQkJCWNhc2UgJ00nOiAgY2FzZSAnTic6ICBjYXNlICdPJzogIGNhc2UgJ1AnOgorCQkJCWNhc2UgJ1EnOiAgY2FzZSAnUic6ICBjYXNlICdTJzogIGNhc2UgJ1QnOgorCQkJCWNhc2UgJ1UnOiAgY2FzZSAnVic6ICBjYXNlICdXJzogIGNhc2UgJ1gnOgorCQkJCWNhc2UgJ1knOiAgY2FzZSAnWic6ICBjYXNlICdfJzogIGNhc2UgJ2EnOgorCQkJCWNhc2UgJ2InOiAgY2FzZSAnYyc6ICBjYXNlICdkJzogIGNhc2UgJ2UnOgorCQkJCWNhc2UgJ2YnOiAgY2FzZSAnZyc6ICBjYXNlICdoJzogIGNhc2UgJ2knOgorCQkJCWNhc2UgJ2onOiAgY2FzZSAnayc6ICBjYXNlICdsJzogIGNhc2UgJ20nOgorCQkJCWNhc2UgJ24nOiAgY2FzZSAnbyc6ICBjYXNlICdwJzogIGNhc2UgJ3EnOgorCQkJCWNhc2UgJ3InOiAgY2FzZSAncyc6ICBjYXNlICd0JzogIGNhc2UgJ3UnOgorCQkJCWNhc2UgJ3YnOiAgY2FzZSAndyc6ICBjYXNlICd4JzogIGNhc2UgJ3knOgorCQkJCWNhc2UgJ3onOiAgY2FzZSAnfic6CisJCQkJeworCQkJCQltSUQodHJ1ZSk7CisJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgJzAnOiAgY2FzZSAnMSc6ICBjYXNlICcyJzogIGNhc2UgJzMnOgorCQkJCWNhc2UgJzQnOiAgY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOgorCQkJCWNhc2UgJzgnOiAgY2FzZSAnOSc6CisJCQkJeworCQkJCQltSU5UX0xJVEVSQUwodHJ1ZSk7CisJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgJ1x0JzogIGNhc2UgJ1xuJzogIGNhc2UgJ1x1MDAwYyc6ICBjYXNlICdccic6CisJCQkJY2FzZSAnICc6CisJCQkJeworCQkJCQltV1ModHJ1ZSk7CisJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgJyYnOgorCQkJCXsKKwkJCQkJbUFNUCh0cnVlKTsKKwkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZGVmYXVsdDoKKwkJCQkJaWYgKChMQSgxKT09Jy4nKSAmJiAoTEEoMik9PScuJykpIHsKKwkJCQkJCW1ET1RfRE9UKHRydWUpOworCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKChMQSgxKT09Jy0nKSAmJiAoTEEoMik9PSc+JykpIHsKKwkJCQkJCW1NSU5VU19HVCh0cnVlKTsKKwkJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsKKwkJCQkJfQorCQkJCQllbHNlIGlmICgoTEEoMSk9PSc+JykgJiYgKExBKDIpPT0nPCcpKSB7CisJCQkJCQltR1RfTFQodHJ1ZSk7CisJCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoKExBKDEpPT0nPCcpICYmIChMQSgyKT09Jz4nKSkgeworCQkJCQkJbUxUX0dUKHRydWUpOworCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKChMQSgxKT09Jy8nKSAmJiAoTEEoMik9PScvJykpIHsKKwkJCQkJCW1TSU5HTEVfTElORV9DT01NRU5UKHRydWUpOworCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKChMQSgxKT09Jy8nKSAmJiAoTEEoMik9PScqJykpIHsKKwkJCQkJCW1NVUxUSV9MSU5FX0NPTU1FTlQodHJ1ZSk7CisJCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoKExBKDEpPT0nLicpICYmICh0cnVlKSkgeworCQkJCQkJbURPVCh0cnVlKTsKKwkJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsKKwkJCQkJfQorCQkJCQllbHNlIGlmICgoTEEoMSk9PSctJykgJiYgKHRydWUpKSB7CisJCQkJCQltTUlOVVModHJ1ZSk7CisJCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoKExBKDEpPT0nPCcpICYmICh0cnVlKSkgeworCQkJCQkJbUxUKHRydWUpOworCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKChMQSgxKT09Jz4nKSAmJiAodHJ1ZSkpIHsKKwkJCQkJCW1HVCh0cnVlKTsKKwkJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsKKwkJCQkJfQorCQkJCWVsc2UgeworCQkJCQlpZiAoTEEoMSk9PUVPRl9DSEFSKSB7dXBvbkVPRigpOyBfcmV0dXJuVG9rZW4gPSBtYWtlVG9rZW4oVG9rZW4uRU9GX1RZUEUpO30KKwkJCQllbHNlIHt0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTt9CisJCQkJfQorCQkJCX0KKwkJCQlpZiAoIF9yZXR1cm5Ub2tlbj09bnVsbCApIGNvbnRpbnVlIHRyeUFnYWluOyAvLyBmb3VuZCBTS0lQIHRva2VuCisJCQkJX3R0eXBlID0gX3JldHVyblRva2VuLmdldFR5cGUoKTsKKwkJCQlfcmV0dXJuVG9rZW4uc2V0VHlwZShfdHR5cGUpOworCQkJCXJldHVybiBfcmV0dXJuVG9rZW47CisJCQl9CisJCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBUb2tlblN0cmVhbVJlY29nbml0aW9uRXhjZXB0aW9uKGUpOworCQkJfQorCQl9CisJCWNhdGNoIChDaGFyU3RyZWFtRXhjZXB0aW9uIGNzZSkgeworCQkJaWYgKCBjc2UgaW5zdGFuY2VvZiBDaGFyU3RyZWFtSU9FeGNlcHRpb24gKSB7CisJCQkJdGhyb3cgbmV3IFRva2VuU3RyZWFtSU9FeGNlcHRpb24oKChDaGFyU3RyZWFtSU9FeGNlcHRpb24pY3NlKS5pbyk7CisJCQl9CisJCQllbHNlIHsKKwkJCQl0aHJvdyBuZXcgVG9rZW5TdHJlYW1FeGNlcHRpb24oY3NlLmdldE1lc3NhZ2UoKSk7CisJCQl9CisJCX0KKwl9Cit9CisKKwlwdWJsaWMgZmluYWwgdm9pZCBtTENVUkxZKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsKKwkJX3R0eXBlID0gTENVUkxZOworCQlpbnQgX3NhdmVJbmRleDsKKwkJCisJCW1hdGNoKCd7Jyk7CisJCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7CisJCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsKKwkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOworCQl9CisJCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsKKwl9CisJCisJcHVibGljIGZpbmFsIHZvaWQgbVJDVVJMWShib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7CisJCV90dHlwZSA9IFJDVVJMWTsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgnfScpOworCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1MU1FVQVJFKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsKKwkJX3R0eXBlID0gTFNRVUFSRTsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgnWycpOworCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1SU1FVQVJFKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsKKwkJX3R0eXBlID0gUlNRVUFSRTsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgnXScpOworCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1MUEFSRU4oYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBMUEFSRU47CisJCWludCBfc2F2ZUluZGV4OworCQkKKwkJbWF0Y2goJygnKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtUlBBUkVOKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsKKwkJX3R0eXBlID0gUlBBUkVOOworCQlpbnQgX3NhdmVJbmRleDsKKwkJCisJCW1hdGNoKCcpJyk7CisJCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7CisJCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsKKwkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOworCQl9CisJCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsKKwl9CisJCisJcHVibGljIGZpbmFsIHZvaWQgbURPVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7CisJCV90dHlwZSA9IERPVDsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgnLicpOworCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1DT01NQShib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7CisJCV90dHlwZSA9IENPTU1BOworCQlpbnQgX3NhdmVJbmRleDsKKwkJCisJCW1hdGNoKCcsJyk7CisJCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7CisJCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsKKwkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOworCQl9CisJCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsKKwl9CisJCisJcHVibGljIGZpbmFsIHZvaWQgbUNPTE9OKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsKKwkJX3R0eXBlID0gQ09MT047CisJCWludCBfc2F2ZUluZGV4OworCQkKKwkJbWF0Y2goJzonKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtU0VNSShib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7CisJCV90dHlwZSA9IFNFTUk7CisJCWludCBfc2F2ZUluZGV4OworCQkKKwkJbWF0Y2goJzsnKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtU1RBUihib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7CisJCV90dHlwZSA9IFNUQVI7CisJCWludCBfc2F2ZUluZGV4OworCQkKKwkJbWF0Y2goJyonKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtUExVUyhib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7CisJCV90dHlwZSA9IFBMVVM7CisJCWludCBfc2F2ZUluZGV4OworCQkKKwkJbWF0Y2goJysnKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtTUlOVVMoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBNSU5VUzsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgnLScpOworCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1FUVVBTFMoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBFUVVBTFM7CisJCWludCBfc2F2ZUluZGV4OworCQkKKwkJbWF0Y2goJz0nKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtUU1BUksoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBRTUFSSzsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgnPycpOworCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1CQU5HKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsKKwkJX3R0eXBlID0gQkFORzsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgnIScpOworCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1ET0xMQVIoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBET0xMQVI7CisJCWludCBfc2F2ZUluZGV4OworCQkKKwkJbWF0Y2goJyQnKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtSEFTSChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7CisJCV90dHlwZSA9IEhBU0g7CisJCWludCBfc2F2ZUluZGV4OworCQkKKwkJbWF0Y2goJyMnKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtQVQoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBBVDsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgnQCcpOworCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1ET1RfRE9UKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsKKwkJX3R0eXBlID0gRE9UX0RPVDsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgiLi4iKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtTUlOVVNfR1QoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBNSU5VU19HVDsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgiLT4iKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtR1RfTFQoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBHVF9MVDsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgiPjwiKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtTFRfR1QoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBMVF9HVDsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgiPD4iKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtU1RSSU5HX0xJVEVSQUwoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBTVFJJTkdfTElURVJBTDsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgnIicpOworCQl7CisJCV9sb29wMTQ0OgorCQlkbyB7CisJCQlpZiAoKExBKDEpPT0nXFwnKSkgeworCQkJCW1FU0MoZmFsc2UpOworCQkJfQorCQkJZWxzZSBpZiAoKF90b2tlblNldF8wLm1lbWJlcihMQSgxKSkpKSB7CisJCQkJbWF0Y2hOb3QoJyInKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWJyZWFrIF9sb29wMTQ0OworCQkJfQorCQkJCisJCX0gd2hpbGUgKHRydWUpOworCQl9CisJCW1hdGNoKCciJyk7CisJCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7CisJCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsKKwkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOworCQl9CisJCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsKKwl9CisJCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgbUVTQyhib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7CisJCV90dHlwZSA9IEVTQzsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgnXFwnKTsKKwkJeworCQlzd2l0Y2ggKCBMQSgxKSkgeworCQljYXNlICd0JzoKKwkJeworCQkJbWF0Y2goJ3QnKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgJ2YnOgorCQl7CisJCQltYXRjaCgnZicpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAncic6CisJCXsKKwkJCW1hdGNoKCdyJyk7CisJCQlicmVhazsKKwkJfQorCQljYXNlICduJzoKKwkJeworCQkJbWF0Y2goJ24nKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgJyInOgorCQl7CisJCQltYXRjaCgnIicpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAnXCcnOgorCQl7CisJCQltYXRjaCgnXCcnKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgJ1xcJzoKKwkJeworCQkJbWF0Y2goJ1xcJyk7CisJCQlicmVhazsKKwkJfQorCQljYXNlICcwJzogIGNhc2UgJzEnOiAgY2FzZSAnMic6ICBjYXNlICczJzoKKwkJY2FzZSAnNCc6ICBjYXNlICc1JzogIGNhc2UgJzYnOiAgY2FzZSAnNyc6CisJCWNhc2UgJzgnOiAgY2FzZSAnOSc6CisJCXsKKwkJCXsKKwkJCW1ESUdJVChmYWxzZSk7CisJCQltRElHSVQoZmFsc2UpOworCQkJbURJR0lUKGZhbHNlKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOworCQl9CisJCX0KKwkJfQorCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1DSEFSX0xJVEVSQUwoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBDSEFSX0xJVEVSQUw7CisJCWludCBfc2F2ZUluZGV4OworCQkKKwkJbWF0Y2goJ1wnJyk7CisJCXsKKwkJaWYgKChMQSgxKT09J1xcJykpIHsKKwkJCW1FU0MoZmFsc2UpOworCQl9CisJCWVsc2UgaWYgKChfdG9rZW5TZXRfMS5tZW1iZXIoTEEoMSkpKSkgeworCQkJbWF0Y2hOb3QoJ1wnJyk7CisJCX0KKwkJZWxzZSB7CisJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsKKwkJfQorCQkKKwkJfQorCQltYXRjaCgnXCcnKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBtRElHSVQoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBESUdJVDsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaFJhbmdlKCcwJywnOScpOworCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1JRChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7CisJCV90dHlwZSA9IElEOworCQlpbnQgX3NhdmVJbmRleDsKKwkJCisJCXsKKwkJc3dpdGNoICggTEEoMSkpIHsKKwkJY2FzZSAnfic6CisJCXsKKwkJCW1hdGNoKCd+Jyk7CisJCQlicmVhazsKKwkJfQorCQljYXNlICdBJzogIGNhc2UgJ0InOiAgY2FzZSAnQyc6ICBjYXNlICdEJzoKKwkJY2FzZSAnRSc6ICBjYXNlICdGJzogIGNhc2UgJ0cnOiAgY2FzZSAnSCc6CisJCWNhc2UgJ0knOiAgY2FzZSAnSic6ICBjYXNlICdLJzogIGNhc2UgJ0wnOgorCQljYXNlICdNJzogIGNhc2UgJ04nOiAgY2FzZSAnTyc6ICBjYXNlICdQJzoKKwkJY2FzZSAnUSc6ICBjYXNlICdSJzogIGNhc2UgJ1MnOiAgY2FzZSAnVCc6CisJCWNhc2UgJ1UnOiAgY2FzZSAnVic6ICBjYXNlICdXJzogIGNhc2UgJ1gnOgorCQljYXNlICdZJzogIGNhc2UgJ1onOiAgY2FzZSAnXyc6ICBjYXNlICdhJzoKKwkJY2FzZSAnYic6ICBjYXNlICdjJzogIGNhc2UgJ2QnOiAgY2FzZSAnZSc6CisJCWNhc2UgJ2YnOiAgY2FzZSAnZyc6ICBjYXNlICdoJzogIGNhc2UgJ2knOgorCQljYXNlICdqJzogIGNhc2UgJ2snOiAgY2FzZSAnbCc6ICBjYXNlICdtJzoKKwkJY2FzZSAnbic6ICBjYXNlICdvJzogIGNhc2UgJ3AnOiAgY2FzZSAncSc6CisJCWNhc2UgJ3InOiAgY2FzZSAncyc6ICBjYXNlICd0JzogIGNhc2UgJ3UnOgorCQljYXNlICd2JzogIGNhc2UgJ3cnOiAgY2FzZSAneCc6ICBjYXNlICd5JzoKKwkJY2FzZSAneic6CisJCXsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCXsKKwkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOworCQl9CisJCX0KKwkJfQorCQl7CisJCXN3aXRjaCAoIExBKDEpKSB7CisJCWNhc2UgJ2EnOiAgY2FzZSAnYic6ICBjYXNlICdjJzogIGNhc2UgJ2QnOgorCQljYXNlICdlJzogIGNhc2UgJ2YnOiAgY2FzZSAnZyc6ICBjYXNlICdoJzoKKwkJY2FzZSAnaSc6ICBjYXNlICdqJzogIGNhc2UgJ2snOiAgY2FzZSAnbCc6CisJCWNhc2UgJ20nOiAgY2FzZSAnbic6ICBjYXNlICdvJzogIGNhc2UgJ3AnOgorCQljYXNlICdxJzogIGNhc2UgJ3InOiAgY2FzZSAncyc6ICBjYXNlICd0JzoKKwkJY2FzZSAndSc6ICBjYXNlICd2JzogIGNhc2UgJ3cnOiAgY2FzZSAneCc6CisJCWNhc2UgJ3knOiAgY2FzZSAneic6CisJCXsKKwkJCW1hdGNoUmFuZ2UoJ2EnLCd6Jyk7CisJCQlicmVhazsKKwkJfQorCQljYXNlICdBJzogIGNhc2UgJ0InOiAgY2FzZSAnQyc6ICBjYXNlICdEJzoKKwkJY2FzZSAnRSc6ICBjYXNlICdGJzogIGNhc2UgJ0cnOiAgY2FzZSAnSCc6CisJCWNhc2UgJ0knOiAgY2FzZSAnSic6ICBjYXNlICdLJzogIGNhc2UgJ0wnOgorCQljYXNlICdNJzogIGNhc2UgJ04nOiAgY2FzZSAnTyc6ICBjYXNlICdQJzoKKwkJY2FzZSAnUSc6ICBjYXNlICdSJzogIGNhc2UgJ1MnOiAgY2FzZSAnVCc6CisJCWNhc2UgJ1UnOiAgY2FzZSAnVic6ICBjYXNlICdXJzogIGNhc2UgJ1gnOgorCQljYXNlICdZJzogIGNhc2UgJ1onOgorCQl7CisJCQltYXRjaFJhbmdlKCdBJywnWicpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAnXyc6CisJCXsKKwkJCW1hdGNoKCdfJyk7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQl7CisJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsKKwkJfQorCQl9CisJCX0KKwkJeworCQlfbG9vcDE1NDoKKwkJZG8geworCQkJc3dpdGNoICggTEEoMSkpIHsKKwkJCWNhc2UgJ2EnOiAgY2FzZSAnYic6ICBjYXNlICdjJzogIGNhc2UgJ2QnOgorCQkJY2FzZSAnZSc6ICBjYXNlICdmJzogIGNhc2UgJ2cnOiAgY2FzZSAnaCc6CisJCQljYXNlICdpJzogIGNhc2UgJ2onOiAgY2FzZSAnayc6ICBjYXNlICdsJzoKKwkJCWNhc2UgJ20nOiAgY2FzZSAnbic6ICBjYXNlICdvJzogIGNhc2UgJ3AnOgorCQkJY2FzZSAncSc6ICBjYXNlICdyJzogIGNhc2UgJ3MnOiAgY2FzZSAndCc6CisJCQljYXNlICd1JzogIGNhc2UgJ3YnOiAgY2FzZSAndyc6ICBjYXNlICd4JzoKKwkJCWNhc2UgJ3knOiAgY2FzZSAneic6CisJCQl7CisJCQkJbWF0Y2hSYW5nZSgnYScsJ3onKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJ0EnOiAgY2FzZSAnQic6ICBjYXNlICdDJzogIGNhc2UgJ0QnOgorCQkJY2FzZSAnRSc6ICBjYXNlICdGJzogIGNhc2UgJ0cnOiAgY2FzZSAnSCc6CisJCQljYXNlICdJJzogIGNhc2UgJ0onOiAgY2FzZSAnSyc6ICBjYXNlICdMJzoKKwkJCWNhc2UgJ00nOiAgY2FzZSAnTic6ICBjYXNlICdPJzogIGNhc2UgJ1AnOgorCQkJY2FzZSAnUSc6ICBjYXNlICdSJzogIGNhc2UgJ1MnOiAgY2FzZSAnVCc6CisJCQljYXNlICdVJzogIGNhc2UgJ1YnOiAgY2FzZSAnVyc6ICBjYXNlICdYJzoKKwkJCWNhc2UgJ1knOiAgY2FzZSAnWic6CisJCQl7CisJCQkJbWF0Y2hSYW5nZSgnQScsJ1onKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJ18nOgorCQkJeworCQkJCW1hdGNoKCdfJyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlICcwJzogIGNhc2UgJzEnOiAgY2FzZSAnMic6ICBjYXNlICczJzoKKwkJCWNhc2UgJzQnOiAgY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOgorCQkJY2FzZSAnOCc6ICBjYXNlICc5JzoKKwkJCXsKKwkJCQltRElHSVQoZmFsc2UpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlicmVhayBfbG9vcDE1NDsKKwkJCX0KKwkJCX0KKwkJfSB3aGlsZSAodHJ1ZSk7CisJCX0KKwkJX3R0eXBlID0gdGVzdExpdGVyYWxzVGFibGUoX3R0eXBlKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtSU5UX0xJVEVSQUwoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBJTlRfTElURVJBTDsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQl7CisJCWludCBfY250MTU3PTA7CisJCV9sb29wMTU3OgorCQlkbyB7CisJCQlpZiAoKChMQSgxKSA+PSAnMCcgJiYgTEEoMSkgPD0gJzknKSkpIHsKKwkJCQltRElHSVQoZmFsc2UpOworCQkJfQorCQkJZWxzZSB7CisJCQkJaWYgKCBfY250MTU3Pj0xICkgeyBicmVhayBfbG9vcDE1NzsgfSBlbHNlIHt0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTt9CisJCQl9CisJCQkKKwkJCV9jbnQxNTcrKzsKKwkJfSB3aGlsZSAodHJ1ZSk7CisJCX0KKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwlwdWJsaWMgZmluYWwgdm9pZCBtV1MoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBXUzsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQl7CisJCWludCBfY250MTYxPTA7CisJCV9sb29wMTYxOgorCQlkbyB7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSAnICc6CisJCQl7CisJCQkJbWF0Y2goJyAnKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJ1x0JzoKKwkJCXsKKwkJCQltYXRjaCgnXHQnKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJ1x1MDAwYyc6CisJCQl7CisJCQkJbWF0Y2goJ1xmJyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlICdccic6CisJCQl7CisJCQkJbWF0Y2goJ1xyJyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlICdcbic6CisJCQl7CisJCQkJbWF0Y2goJ1xuJyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJeworCQkJCWlmICggX2NudDE2MT49MSApIHsgYnJlYWsgX2xvb3AxNjE7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7fQorCQkJfQorCQkJfQorCQkJX2NudDE2MSsrOworCQl9IHdoaWxlICh0cnVlKTsKKwkJfQorCQlfdHR5cGUgPSBUb2tlbi5TS0lQOworCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1TSU5HTEVfTElORV9DT01NRU5UKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsKKwkJX3R0eXBlID0gU0lOR0xFX0xJTkVfQ09NTUVOVDsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgiLy8iKTsKKwkJeworCQlfbG9vcDE2NToKKwkJZG8geworCQkJaWYgKChfdG9rZW5TZXRfMi5tZW1iZXIoTEEoMSkpKSkgeworCQkJCXsKKwkJCQltYXRjaChfdG9rZW5TZXRfMik7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJYnJlYWsgX2xvb3AxNjU7CisJCQl9CisJCQkKKwkJfSB3aGlsZSAodHJ1ZSk7CisJCX0KKwkJeworCQlzd2l0Y2ggKCBMQSgxKSkgeworCQljYXNlICdcbic6CisJCXsKKwkJCW1hdGNoKCdcbicpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAnXHInOgorCQl7CisJCQltYXRjaCgnXHInKTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQl7CisJCQl9CisJCX0KKwkJfQorCQlfdHR5cGUgPSBUb2tlbi5TS0lQOworCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1NVUxUSV9MSU5FX0NPTU1FTlQoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOworCQlfdHR5cGUgPSBNVUxUSV9MSU5FX0NPTU1FTlQ7CisJCWludCBfc2F2ZUluZGV4OworCQkKKwkJbWF0Y2goIi8qIik7CisJCXsKKwkJaWYgKChfdG9rZW5TZXRfMy5tZW1iZXIoTEEoMSkpKSAmJiAoKExBKDIpID49ICdcdTAwMDAnICYmIExBKDIpIDw9ICdcdWZmZmUnKSkgJiYgKChMQSgzKSA+PSAnXHUwMDAwJyAmJiBMQSgzKSA8PSAnXHVmZmZlJykpKSB7CisJCQl7CisJCQltYXRjaE5vdCgnIScpOworCQkJeworCQkJX2xvb3AxNzE6CisJCQlkbyB7CisJCQkJaWYgKChMQSgxKT09JyonKSAmJiAoX3Rva2VuU2V0XzQubWVtYmVyKExBKDIpKSkpIHsKKwkJCQkJbWF0Y2goJyonKTsKKwkJCQkJbWF0Y2hOb3QoJy8nKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKF90b2tlblNldF81Lm1lbWJlcihMQSgxKSkpKSB7CisJCQkJCW1hdGNoTm90KCcqJyk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlicmVhayBfbG9vcDE3MTsKKwkJCQl9CisJCQkJCisJCQl9IHdoaWxlICh0cnVlKTsKKwkJCX0KKwkJCW1hdGNoKCIqLyIpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKChMQSgxKT09JyonKSAmJiAoTEEoMik9PScvJykgJiYgKHRydWUpKSB7CisJCQltYXRjaCgiKi8iKTsKKwkJfQorCQllbHNlIHsKKwkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOworCQl9CisJCQorCQl9CisJCV90dHlwZSA9IFRva2VuLlNLSVA7CisJCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7CisJCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsKKwkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOworCQl9CisJCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsKKwl9CisJCisJcHVibGljIGZpbmFsIHZvaWQgbUFNUChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7CisJCV90dHlwZSA9IEFNUDsKKwkJaW50IF9zYXZlSW5kZXg7CisJCQorCQltYXRjaCgnJicpOworCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgeworCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7CisJCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsKKwkJfQorCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47CisJfQorCQorCXB1YmxpYyBmaW5hbCB2b2lkIG1MVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7CisJCV90dHlwZSA9IExUOworCQlpbnQgX3NhdmVJbmRleDsKKwkJCisJCW1hdGNoKCc8Jyk7CisJCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7CisJCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsKKwkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOworCQl9CisJCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsKKwl9CisJCisJcHVibGljIGZpbmFsIHZvaWQgbUdUKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsKKwkJX3R0eXBlID0gR1Q7CisJCWludCBfc2F2ZUluZGV4OworCQkKKwkJbWF0Y2goJz4nKTsKKwkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsKKwkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOworCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7CisJCX0KKwkJX3JldHVyblRva2VuID0gX3Rva2VuOworCX0KKwkKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMCgpIHsKKwkJbG9uZ1tdIGRhdGEgPSBuZXcgbG9uZ1syMDQ4XTsKKwkJZGF0YVswXT0tMTcxNzk4NjkxODVMOworCQlkYXRhWzFdPS0yNjg0MzU0NTdMOworCQlmb3IgKGludCBpID0gMjsgaTw9MTAyMjsgaSsrKSB7IGRhdGFbaV09LTFMOyB9CisJCWRhdGFbMTAyM109OTIyMzM3MjAzNjg1NDc3NTgwN0w7CisJCXJldHVybiBkYXRhOworCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMCgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMSgpIHsKKwkJbG9uZ1tdIGRhdGEgPSBuZXcgbG9uZ1syMDQ4XTsKKwkJZGF0YVswXT0tNTQ5NzU1ODEzODg5TDsKKwkJZGF0YVsxXT0tMjY4NDM1NDU3TDsKKwkJZm9yIChpbnQgaSA9IDI7IGk8PTEwMjI7IGkrKykgeyBkYXRhW2ldPS0xTDsgfQorCQlkYXRhWzEwMjNdPTkyMjMzNzIwMzY4NTQ3NzU4MDdMOworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzEgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzEoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzIoKSB7CisJCWxvbmdbXSBkYXRhID0gbmV3IGxvbmdbMjA0OF07CisJCWRhdGFbMF09LTkyMTdMOworCQlmb3IgKGludCBpID0gMTsgaTw9MTAyMjsgaSsrKSB7IGRhdGFbaV09LTFMOyB9CisJCWRhdGFbMTAyM109OTIyMzM3MjAzNjg1NDc3NTgwN0w7CisJCXJldHVybiBkYXRhOworCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMigpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMygpIHsKKwkJbG9uZ1tdIGRhdGEgPSBuZXcgbG9uZ1syMDQ4XTsKKwkJZGF0YVswXT0tODU4OTkzNDU5M0w7CisJCWZvciAoaW50IGkgPSAxOyBpPD0xMDIyOyBpKyspIHsgZGF0YVtpXT0tMUw7IH0KKwkJZGF0YVsxMDIzXT05MjIzMzcyMDM2ODU0Nzc1ODA3TDsKKwkJcmV0dXJuIGRhdGE7CisJfQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zID0gbmV3IEJpdFNldChta190b2tlblNldF8zKCkpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF80KCkgeworCQlsb25nW10gZGF0YSA9IG5ldyBsb25nWzIwNDhdOworCQlkYXRhWzBdPS0xNDA3Mzc0ODgzNTUzMjlMOworCQlmb3IgKGludCBpID0gMTsgaTw9MTAyMjsgaSsrKSB7IGRhdGFbaV09LTFMOyB9CisJCWRhdGFbMTAyM109OTIyMzM3MjAzNjg1NDc3NTgwN0w7CisJCXJldHVybiBkYXRhOworCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNCgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNSgpIHsKKwkJbG9uZ1tdIGRhdGEgPSBuZXcgbG9uZ1syMDQ4XTsKKwkJZGF0YVswXT0tNDM5ODA0NjUxMTEwNUw7CisJCWZvciAoaW50IGkgPSAxOyBpPD0xMDIyOyBpKyspIHsgZGF0YVtpXT0tMUw7IH0KKwkJZGF0YVsxMDIzXT05MjIzMzcyMDM2ODU0Nzc1ODA3TDsKKwkJcmV0dXJuIGRhdGE7CisJfQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF81ID0gbmV3IEJpdFNldChta190b2tlblNldF81KCkpOworCQorCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0FOVExSdjJwYXJzZXIvRW1mYXRpY0xleGVyLnNtYXAgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9BTlRMUnYycGFyc2VyL0VtZmF0aWNMZXhlci5zbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Mzk4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9BTlRMUnYycGFyc2VyL0VtZmF0aWNMZXhlci5zbWFwCkBAIC0wLDAgKzEsNjQ5IEBACitTTUFQCitFbWZhdGljTGV4ZXIuamF2YQorRworKlMgRworKkYKKysgMCBFbWZhdGljLmcKK0VtZmF0aWMuZworKkwKKzA6ODkKKzA6OTUKKzA6MTAxCiswOjEwNworMDoxMTMKKzA6MTE5CiswOjEyNQorMDoxMzEKKzA6MTM3CiswOjE0MworMDoxNDkKKzA6MTU1CiswOjE2MQorMDoxNjcKKzA6MTczCiswOjE3OQorMDoxODUKKzA6MTkxCiswOjE5NworMDoyMTYKKzA6MjI0CiswOjIzMQorMDoyMzcKKzA6MjQzCiswOjI0NworMDoyNTEKKzA6MjU1CiswOjI1OQorMDoyNjMKKzA6MjY3CiswOjI3MQorMDoyNzUKKzA6Mjc5CiszOjMKKzM6NAorMzo1CiszOjYKKzQ5MDozMDcKKzQ5MDozMDgKKzQ5MDozMDkKKzQ5MDozMTAKKzQ5MDozMTIKKzQ5MDozMTMKKzQ5MDozMTQKKzQ5MDozMTUKKzQ5MDozMTYKKzQ5MDozMTcKKzQ5MDozMTgKKzQ5MTozMjAKKzQ5MTozMjEKKzQ5MTozMjIKKzQ5MTozMjMKKzQ5MTozMjUKKzQ5MTozMjYKKzQ5MTozMjcKKzQ5MTozMjgKKzQ5MTozMjkKKzQ5MTozMzAKKzQ5MTozMzEKKzQ5MjozMzMKKzQ5MjozMzQKKzQ5MjozMzUKKzQ5MjozMzYKKzQ5MjozMzgKKzQ5MjozMzkKKzQ5MjozNDAKKzQ5MjozNDEKKzQ5MjozNDIKKzQ5MjozNDMKKzQ5MjozNDQKKzQ5MzozNDYKKzQ5MzozNDcKKzQ5MzozNDgKKzQ5MzozNDkKKzQ5MzozNTEKKzQ5MzozNTIKKzQ5MzozNTMKKzQ5MzozNTQKKzQ5MzozNTUKKzQ5MzozNTYKKzQ5MzozNTcKKzQ5NDozNTkKKzQ5NDozNjAKKzQ5NDozNjEKKzQ5NDozNjIKKzQ5NDozNjQKKzQ5NDozNjUKKzQ5NDozNjYKKzQ5NDozNjcKKzQ5NDozNjgKKzQ5NDozNjkKKzQ5NDozNzAKKzQ5NTozNzIKKzQ5NTozNzMKKzQ5NTozNzQKKzQ5NTozNzUKKzQ5NTozNzcKKzQ5NTozNzgKKzQ5NTozNzkKKzQ5NTozODAKKzQ5NTozODEKKzQ5NTozODIKKzQ5NTozODMKKzQ5NzozODUKKzQ5NzozODYKKzQ5NzozODcKKzQ5NzozODgKKzQ5NzozOTAKKzQ5NzozOTEKKzQ5NzozOTIKKzQ5NzozOTMKKzQ5NzozOTQKKzQ5NzozOTUKKzQ5NzozOTYKKzQ5ODozOTgKKzQ5ODozOTkKKzQ5ODo0MDAKKzQ5ODo0MDEKKzQ5ODo0MDMKKzQ5ODo0MDQKKzQ5ODo0MDUKKzQ5ODo0MDYKKzQ5ODo0MDcKKzQ5ODo0MDgKKzQ5ODo0MDkKKzQ5OTo0MTEKKzQ5OTo0MTIKKzQ5OTo0MTMKKzQ5OTo0MTQKKzQ5OTo0MTYKKzQ5OTo0MTcKKzQ5OTo0MTgKKzQ5OTo0MTkKKzQ5OTo0MjAKKzQ5OTo0MjEKKzQ5OTo0MjIKKzUwMDo0MjQKKzUwMDo0MjUKKzUwMDo0MjYKKzUwMDo0MjcKKzUwMDo0MjkKKzUwMDo0MzAKKzUwMDo0MzEKKzUwMDo0MzIKKzUwMDo0MzMKKzUwMDo0MzQKKzUwMDo0MzUKKzUwMjo0MzcKKzUwMjo0MzgKKzUwMjo0MzkKKzUwMjo0NDAKKzUwMjo0NDIKKzUwMjo0NDMKKzUwMjo0NDQKKzUwMjo0NDUKKzUwMjo0NDYKKzUwMjo0NDcKKzUwMjo0NDgKKzUwMzo0NTAKKzUwMzo0NTEKKzUwMzo0NTIKKzUwMzo0NTMKKzUwMzo0NTUKKzUwMzo0NTYKKzUwMzo0NTcKKzUwMzo0NTgKKzUwMzo0NTkKKzUwMzo0NjAKKzUwMzo0NjEKKzUwNDo0NjMKKzUwNDo0NjQKKzUwNDo0NjUKKzUwNDo0NjYKKzUwNDo0NjgKKzUwNDo0NjkKKzUwNDo0NzAKKzUwNDo0NzEKKzUwNDo0NzIKKzUwNDo0NzMKKzUwNDo0NzQKKzUwNTo0NzYKKzUwNTo0NzcKKzUwNTo0NzgKKzUwNTo0NzkKKzUwNTo0ODEKKzUwNTo0ODIKKzUwNTo0ODMKKzUwNTo0ODQKKzUwNTo0ODUKKzUwNTo0ODYKKzUwNTo0ODcKKzUwNzo0ODkKKzUwNzo0OTAKKzUwNzo0OTEKKzUwNzo0OTIKKzUwNzo0OTQKKzUwNzo0OTUKKzUwNzo0OTYKKzUwNzo0OTcKKzUwNzo0OTgKKzUwNzo0OTkKKzUwNzo1MDAKKzUwODo1MDIKKzUwODo1MDMKKzUwODo1MDQKKzUwODo1MDUKKzUwODo1MDcKKzUwODo1MDgKKzUwODo1MDkKKzUwODo1MTAKKzUwODo1MTEKKzUwODo1MTIKKzUwODo1MTMKKzUwOTo1MTUKKzUwOTo1MTYKKzUwOTo1MTcKKzUwOTo1MTgKKzUwOTo1MjAKKzUwOTo1MjEKKzUwOTo1MjIKKzUwOTo1MjMKKzUwOTo1MjQKKzUwOTo1MjUKKzUwOTo1MjYKKzUxMDo1MjgKKzUxMDo1MjkKKzUxMDo1MzAKKzUxMDo1MzEKKzUxMDo1MzMKKzUxMDo1MzQKKzUxMDo1MzUKKzUxMDo1MzYKKzUxMDo1MzcKKzUxMDo1MzgKKzUxMDo1MzkKKzUxMTo1NDEKKzUxMTo1NDIKKzUxMTo1NDMKKzUxMTo1NDQKKzUxMTo1NDYKKzUxMTo1NDcKKzUxMTo1NDgKKzUxMTo1NDkKKzUxMTo1NTAKKzUxMTo1NTEKKzUxMTo1NTIKKzUxMzo1NTQKKzUxMzo1NTUKKzUxMzo1NTYKKzUxMzo1NTcKKzUxMzo1NTkKKzUxMzo1NjAKKzUxMzo1NjEKKzUxMzo1NjIKKzUxMzo1NjMKKzUxMzo1NjQKKzUxMzo1NjUKKzUxNDo1NjcKKzUxNDo1NjgKKzUxNDo1NjkKKzUxNDo1NzAKKzUxNDo1NzIKKzUxNDo1NzMKKzUxNDo1NzQKKzUxNDo1NzUKKzUxNDo1NzYKKzUxNDo1NzcKKzUxNDo1NzgKKzUxNTo1ODAKKzUxNTo1ODEKKzUxNTo1ODIKKzUxNTo1ODMKKzUxNTo1ODUKKzUxNTo1ODYKKzUxNTo1ODcKKzUxNTo1ODgKKzUxNTo1ODkKKzUxNTo1OTAKKzUxNTo1OTEKKzUxNjo1OTMKKzUxNjo1OTQKKzUxNjo1OTUKKzUxNjo1OTYKKzUxNjo1OTgKKzUxNjo1OTkKKzUxNjo2MDAKKzUxNjo2MDEKKzUxNjo2MDIKKzUxNjo2MDMKKzUxNjo2MDQKKzUxODo2MDYKKzUxODo2MDcKKzUxODo2MDgKKzUxODo2MDkKKzUxODo2MTEKKzUxODo2MTIKKzUxODo2MTMKKzUxODo2MTQKKzUxODo2MTUKKzUxODo2MTYKKzUxODo2MTcKKzUxODo2MTgKKzUxODo2MTkKKzUxODo2MjAKKzUxODo2MjEKKzUxODo2MjIKKzUxODo2MjMKKzUxODo2MjUKKzUxODo2MjYKKzUxODo2MjcKKzUxODo2MjgKKzUxODo2MjkKKzUxODo2MzAKKzUxODo2MzEKKzUxODo2MzIKKzUxODo2MzMKKzUxOTo3MDIKKzUxOTo3MDMKKzUxOTo3MDQKKzUxOTo3MDUKKzUxOTo3MDcKKzUxOTo3MDkKKzUxOTo3MTAKKzUxOTo3MTEKKzUxOTo3MTIKKzUxOTo3MTMKKzUxOTo3MTQKKzUxOTo3MTUKKzUxOTo3MTYKKzUxOTo3MTcKKzUxOTo3MjAKKzUxOTo3MjEKKzUxOTo3MjIKKzUxOTo3MjMKKzUxOTo3MjQKKzUxOTo3MjUKKzUxOTo3MjYKKzUyNDo2MzUKKzUyNDo2MzYKKzUyNDo2MzcKKzUyNDo2MzgKKzUyNDo2OTUKKzUyNDo2OTYKKzUyNDo2OTcKKzUyNDo2OTgKKzUyNDo2OTkKKzUyNDo3MDAKKzUyNTo2NDAKKzUyNTo2NDIKKzUyNTo2NDMKKzUyNTo2NDQKKzUyNTo2NDUKKzUyNTo2NDgKKzUyNTo2NDkKKzUyNTo2NTAKKzUyNTo2NTMKKzUyNTo2NTQKKzUyNTo2NTUKKzUyNTo2NTgKKzUyNTo2NTkKKzUyNTo2NjAKKzUyNTo2NjMKKzUyNTo2NjQKKzUyNTo2NjUKKzUyNTo2NjgKKzUyNTo2NjkKKzUyNTo2NzAKKzUyNTo2NzMKKzUyNTo2NzQKKzUyNTo2NzUKKzUyNTo2NzgKKzUyNTo2NzkKKzUyNTo2ODAKKzUyNTo2ODEKKzUyNTo2ODMKKzUyNTo2ODQKKzUyNTo2ODUKKzUyNTo2ODkKKzUyNTo2OTAKKzUyNTo2OTEKKzUyNTo2OTIKKzUyNTo2OTMKKzUyODo3NDEKKzUyODo3NDIKKzUyODo3NDMKKzUyODo3NDQKKzUyODo4NTYKKzUyODo4NTcKKzUyODo4NTgKKzUyODo4NTkKKzUyODo4NjAKKzUyODo4NjEKKzUyODo4NjIKKzUyOTo3NDcKKzUyOTo3NDgKKzUyOTo3NDkKKzUyOTo3NTAKKzUyOTo3NzAKKzUyOTo3NzEKKzUyOTo3NzIKKzUyOTo3NzMKKzUyOTo3NzQKKzUyOTo3NzcKKzUyOTo3NzgKKzUyOTo3NzkKKzUyOTo3ODAKKzUyOTo3ODEKKzUyOTo3ODIKKzUyOTo3ODMKKzUyOTo3ODQKKzUyOTo3ODUKKzUyOTo3ODYKKzUyOTo3ODkKKzUyOTo3OTAKKzUyOTo3OTEKKzUyOTo3OTIKKzUyOTo3OTMKKzUyOTo3OTQKKzUyOTo3OTUKKzUyOTo3OTYKKzUyOTo3OTcKKzUyOTo4MDAKKzUyOTo4MDEKKzUyOTo4MDIKKzUyOTo4MDUKKzUyOTo4MDYKKzUyOTo4MDcKKzUyOTo4MDgKKzUyOTo4MDkKKzUyOTo4MTEKKzUyOTo4MTIKKzUyOTo4MTMKKzUyOTo4MTQKKzUyOTo4MTUKKzUyOTo4MTYKKzUyOTo4MTcKKzUyOTo4MTgKKzUyOTo4MTkKKzUyOTo4MjAKKzUyOTo4MjEKKzUyOTo4MjIKKzUyOTo4MjMKKzUyOTo4MjYKKzUyOTo4MjcKKzUyOTo4MjgKKzUyOTo4MjkKKzUyOTo4MzAKKzUyOTo4MzEKKzUyOTo4MzIKKzUyOTo4MzMKKzUyOTo4MzQKKzUyOTo4MzcKKzUyOTo4MzgKKzUyOTo4MzkKKzUyOTo4NDIKKzUyOTo4NDMKKzUyOTo4NDQKKzUyOTo4NDUKKzUyOTo4NDYKKzUyOTo4NDkKKzUyOTo4NTAKKzUyOTo4NTEKKzUyOTo4NTIKKzUyOTo4NTMKKzUyOTo4NTQKKzUyOTo4NTUKKzUzMTo4NjQKKzUzMTo4NjUKKzUzMTo4NjYKKzUzMTo4NjcKKzUzMTo4NzAKKzUzMTo4NzEKKzUzMTo4NzIKKzUzMTo4NzMKKzUzMTo4NzQKKzUzMTo4NzUKKzUzMTo4NzYKKzUzMTo4NzcKKzUzMTo4NzgKKzUzMTo4ODAKKzUzMTo4ODEKKzUzMTo4ODIKKzUzMTo4ODMKKzUzMTo4ODQKKzUzMTo4ODUKKzUzMTo4ODYKKzUzMTo4ODcKKzUzMTo4ODgKKzUzMzo3MjgKKzUzMzo3MjkKKzUzMzo3MzAKKzUzMzo3MzEKKzUzMzo3MzMKKzUzMzo3MzQKKzUzMzo3MzUKKzUzMzo3MzYKKzUzMzo3MzcKKzUzMzo3MzgKKzUzMzo3MzkKKzUzNTo4OTAKKzUzNTo4OTEKKzUzNTo4OTIKKzUzNTo4OTMKKzUzNTo4OTYKKzUzNTo4OTcKKzUzNTo4OTgKKzUzNTo4OTkKKzUzNTo5MDAKKzUzNTo5MDEKKzUzNTo5MDIKKzUzNTo5MDUKKzUzNTo5MDYKKzUzNTo5MDcKKzUzNTo5MTAKKzUzNTo5MTEKKzUzNTo5MTIKKzUzNTo5MTUKKzUzNTo5MTYKKzUzNTo5MTcKKzUzNTo5MjAKKzUzNTo5MjEKKzUzNTo5MjIKKzUzNTo5MjUKKzUzNTo5MjYKKzUzNTo5MjcKKzUzNTo5MjgKKzUzNTo5MjkKKzUzNTo5MzAKKzUzNTo5MzEKKzUzNTo5MzIKKzUzNTo5MzQKKzUzNTo5MzUKKzUzNTo5MzYKKzUzNTo5MzcKKzUzNTo5MzgKKzUzNTo5MzkKKzUzNjo5MzMKKzUzOTo5NDEKKzUzOTo5NDIKKzUzOTo5NDMKKzUzOTo5NDQKKzUzOTo5NDYKKzUzOTo5NDcKKzUzOTo5NDgKKzUzOTo5NDkKKzUzOTo5NTAKKzUzOTo5NTIKKzUzOTo5NTQKKzUzOTo5NTUKKzUzOTo5NTYKKzUzOTo5NTcKKzUzOTo5NTkKKzUzOTo5NjAKKzUzOTo5NjIKKzUzOTo5NjMKKzUzOTo5NjQKKzUzOTo5NjUKKzUzOTo5NjgKKzUzOTo5NjkKKzUzOTo5NzAKKzUzOTo5NzMKKzUzOTo5NzUKKzUzOTo5NzYKKzUzOTo5NzkKKzUzOTo5ODAKKzUzOTo5ODEKKzUzOTo5ODIKKzUzOTo5ODMKKzUzOTo5ODQKKzU0MDo5NzgKKzU0Mzo5ODYKKzU0Mzo5ODcKKzU0Mzo5ODgKKzU0Mzo5ODkKKzU0Mzo5OTEKKzU0Mzo5OTMKKzU0Mzo5OTUKKzU0Mzo5OTYKKzU0Mzo5OTcKKzU0Mzo5OTgKKzU0Mzo5OTkKKzU0MzoxMDAwCis1NDM6MTAwMQorNTQzOjEwMDIKKzU0MzoxMDAzCis1NDM6MTAwNAorNTQzOjEwMDUKKzU0MzoxMDA2Cis1NDM6MTAwNworNTQzOjEwMDgKKzU0MzoxMDEwCis1NDM6MTAxMQorNTQzOjEwMTIKKzU0MzoxMDE0Cis1NDM6MTAxNQorNTQzOjEwMTYKKzU0MzoxMDE3Cis1NDM6MTAxOAorNTQzOjEwMTkKKzU0MzoxMDIwCis1NDM6MTAyNAorNTQzOjEwMjUKKzU0MzoxMDI2Cis1NDM6MTAyNworNTQzOjEwMjgKKzU0MzoxMDI5Cis1NDQ6MTAyMworNTQ3OjEwMzEKKzU0NzoxMDMyCis1NDc6MTAzMworNTQ3OjEwMzQKKzU0NzoxMDM2Cis1NDc6MTAzNworNTQ3OjEwMzgKKzU0NzoxMDM5Cis1NDc6MTA0MAorNTQ3OjEwNDEKKzU0NzoxMDQyCis1NDg6MTA0NAorNTQ4OjEwNDUKKzU0ODoxMDQ2Cis1NDg6MTA0NworNTQ4OjEwNDkKKzU0ODoxMDUwCis1NDg6MTA1MQorNTQ4OjEwNTIKKzU0ODoxMDUzCis1NDg6MTA1NAorNTQ4OjEwNTUKKzU0OToxMDU3Cis1NDk6MTA1OAorNTQ5OjEwNTkKKzU0OToxMDYwCis1NDk6MTA2MgorNTQ5OjEwNjMKKzU0OToxMDY0Cis1NDk6MTA2NQorNTQ5OjEwNjYKKzU0OToxMDY3Cis1NDk6MTA2OAorKkUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0FOVExSdjJwYXJzZXIvRW1mYXRpY1BhcnNlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvQU5UTFJ2MnBhcnNlci9FbWZhdGljUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzZGEyOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0FOVExSdjJwYXJzZXIvRW1mYXRpY1BhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjMxNyBAQAorLy8gJEFOVExSIDogIkVtZmF0aWMuZyIgLT4gIkVtZmF0aWNQYXJzZXIuamF2YSIkCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5wYXJzZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuKjsKKworaW1wb3J0IGFudGxyLlRva2VuQnVmZmVyOworaW1wb3J0IGFudGxyLlRva2VuU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGFudGxyLlRva2VuU3RyZWFtSU9FeGNlcHRpb247CitpbXBvcnQgYW50bHIuQU5UTFJFeGNlcHRpb247CitpbXBvcnQgYW50bHIuTExrUGFyc2VyOworaW1wb3J0IGFudGxyLlRva2VuOworaW1wb3J0IGFudGxyLlRva2VuU3RyZWFtOworaW1wb3J0IGFudGxyLlJlY29nbml0aW9uRXhjZXB0aW9uOworaW1wb3J0IGFudGxyLk5vVmlhYmxlQWx0RXhjZXB0aW9uOworaW1wb3J0IGFudGxyLk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbjsKK2ltcG9ydCBhbnRsci5TZW1hbnRpY0V4Y2VwdGlvbjsKK2ltcG9ydCBhbnRsci5QYXJzZXJTaGFyZWRJbnB1dFN0YXRlOworaW1wb3J0IGFudGxyLmNvbGxlY3Rpb25zLmltcGwuQml0U2V0OworCitwdWJsaWMgY2xhc3MgRW1mYXRpY1BhcnNlciBleHRlbmRzIGFudGxyLkxMa1BhcnNlciAgICAgICBpbXBsZW1lbnRzIEVtZmF0aWNQYXJzZXJUb2tlblR5cGVzCisgeworCisgICAgcHJpdmF0ZSBQYXJzZUVycm9yIGNyZWF0ZVBhcnNlRXJyb3IoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgcmV0dXJuIEVtZmF0aWNQYXJzZXJEcml2ZXIuY3JlYXRlUGFyc2VFcnJvcihleCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBUb2tlbkluZm8gY3JlYXRlVG9rZW5JbmZvKFRva2VuIHRvaykgeworICAgICAgICBpZiAodG9rID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICBlbHNlIHJldHVybiBuZXcgVG9rZW5JbmZvKHRvay5nZXRUZXh0KCksIHRvay5nZXRDb2x1bW4oKSwgdG9rLmdldFR5cGUoKSk7CisgICAgfQorCisKKwlwcml2YXRlIFBhcnNlQ29udGV4dCBfcGFyc2VDb250ZXh0OworCXB1YmxpYyB2b2lkIHNldFBhcnNlQ29udGV4dChQYXJzZUNvbnRleHQgcGFyc2VDb250ZXh0KSB7CisJCV9wYXJzZUNvbnRleHQgPSBwYXJzZUNvbnRleHQ7CisJfQorCQorICAgIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIGlmIChfcGFyc2VDb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgCV9wYXJzZUNvbnRleHQuYWRkUGFyc2VNZXNzYWdlKGNyZWF0ZVBhcnNlRXJyb3IoZXgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBzKSB7CisgICAgICAgIGlmIChfcGFyc2VDb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgCV9wYXJzZUNvbnRleHQuYWRkUGFyc2VNZXNzYWdlKG5ldyBQYXJzZUVycm9yKHMsIC0xKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXBvcnRXYXJuaW5nKFN0cmluZyBzKSB7CisgICAgCWlmIChfcGFyc2VDb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgCV9wYXJzZUNvbnRleHQuYWRkUGFyc2VNZXNzYWdlKG5ldyBQYXJzZVdhcm5pbmcocywgLTEpKTsKKyAgICAgICAgfQorICAgIH0KKworCitwcm90ZWN0ZWQgRW1mYXRpY1BhcnNlcihUb2tlbkJ1ZmZlciB0b2tlbkJ1ZiwgaW50IGspIHsKKyAgc3VwZXIodG9rZW5CdWYsayk7CisgIHRva2VuTmFtZXMgPSBfdG9rZW5OYW1lczsKK30KKworcHVibGljIEVtZmF0aWNQYXJzZXIoVG9rZW5CdWZmZXIgdG9rZW5CdWYpIHsKKyAgdGhpcyh0b2tlbkJ1ZiwzKTsKK30KKworcHJvdGVjdGVkIEVtZmF0aWNQYXJzZXIoVG9rZW5TdHJlYW0gbGV4ZXIsIGludCBrKSB7CisgIHN1cGVyKGxleGVyLGspOworICB0b2tlbk5hbWVzID0gX3Rva2VuTmFtZXM7Cit9CisKK3B1YmxpYyBFbWZhdGljUGFyc2VyKFRva2VuU3RyZWFtIGxleGVyKSB7CisgIHRoaXMobGV4ZXIsMyk7Cit9CisKK3B1YmxpYyBFbWZhdGljUGFyc2VyKFBhcnNlclNoYXJlZElucHV0U3RhdGUgc3RhdGUpIHsKKyAgc3VwZXIoc3RhdGUsMyk7CisgIHRva2VuTmFtZXMgPSBfdG9rZW5OYW1lczsKK30KKworCXB1YmxpYyBmaW5hbCBDb21wVW5pdCAgY29tcFVuaXQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIENvbXBVbml0IHJldFZhbCA9IG51bGwgOworCQkKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlQYWNrYWdlRGVjbCBwYWNrYWdlRGVjbCA9IG51bGw7IEltcG9ydFN0bXRzIGltcG9ydFN0bXRzID0gbnVsbDsgVG9wTGV2ZWxEZWNscyB0b3BMZXZlbERlY2xzID0gbnVsbDsKKwkJCXBhY2thZ2VEZWNsPXBhY2thZ2VEZWNsKCk7CisJCQlpbXBvcnRTdG10cz1pbXBvcnRTdG10cygpOworCQkJdG9wTGV2ZWxEZWNscz10b3BMZXZlbERlY2xzKCk7CisJCQltYXRjaChUb2tlbi5FT0ZfVFlQRSk7CisJCQlyZXRWYWwgPSBuZXcgQ29tcFVuaXQocGFja2FnZURlY2wsIGltcG9ydFN0bXRzLCB0b3BMZXZlbERlY2xzKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzApOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBQYWNrYWdlRGVjbCAgcGFja2FnZURlY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFBhY2thZ2VEZWNsIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIHBhY2thZ2VfS1cgPSBudWxsOworCQlUb2tlbiAgc2VtaSA9IG51bGw7CisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgPSBudWxsOyBRdWFsaWZpZWRJRCBuYW1lID0gbnVsbDsKKwkJCWFubm90YXRpb25zPWFubm90YXRpb25zKCk7CisJCQlwYWNrYWdlX0tXID0gTFQoMSk7CisJCQltYXRjaChMSVRFUkFMX3BhY2thZ2UpOworCQkJbmFtZT1xdWFsaWZpZWRJRCgpOworCQkJc2VtaSA9IExUKDEpOworCQkJbWF0Y2goU0VNSSk7CisJCQlyZXRWYWwgPSBuZXcgUGFja2FnZURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhwYWNrYWdlX0tXKSwgbmFtZSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBJbXBvcnRTdG10cyAgaW1wb3J0U3RtdHMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIEltcG9ydFN0bXRzIHJldFZhbCA9IG5ldyBJbXBvcnRTdG10cygpIDsKKwkJCisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJSW1wb3J0U3RtdCBpbXBvcnRTdG10ID0gbnVsbDsKKwkJCXsKKwkJCV9sb29wMjI6CisJCQlkbyB7CisJCQkJaWYgKChMQSgxKT09TElURVJBTF9pbXBvcnQpKSB7CisJCQkJCWltcG9ydFN0bXQ9aW1wb3J0U3RtdCgpOworCQkJCQlyZXRWYWwuYWRkQ2hpbGQoaW1wb3J0U3RtdCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlicmVhayBfbG9vcDIyOworCQkJCX0KKwkJCQkKKwkJCX0gd2hpbGUgKHRydWUpOworCQkJfQorCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMik7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIFRvcExldmVsRGVjbHMgIHRvcExldmVsRGVjbHMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFRvcExldmVsRGVjbHMgcmV0VmFsID0gbmV3IFRvcExldmVsRGVjbHMoKSA7CisJCQorCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCVRvcExldmVsRGVjbCB0b3BMZXZlbERlY2wgPSBudWxsOworCQkJeworCQkJX2xvb3AyNzoKKwkJCWRvIHsKKwkJCQlpZiAoKF90b2tlblNldF8zLm1lbWJlcihMQSgxKSkpKSB7CisJCQkJCXRvcExldmVsRGVjbD10b3BMZXZlbERlY2woKTsKKwkJCQkJcmV0VmFsLmFkZENoaWxkKHRvcExldmVsRGVjbCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlicmVhayBfbG9vcDI3OworCQkJCX0KKwkJCQkKKwkJCX0gd2hpbGUgKHRydWUpOworCQkJfQorCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNCk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIEFubm90YXRpb25zICBhbm5vdGF0aW9ucygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgQW5ub3RhdGlvbnMgcmV0VmFsID0gbmV3IEFubm90YXRpb25zKCkgOworCQkKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBudWxsOworCQkJeworCQkJX2xvb3AxNDoKKwkJCWRvIHsKKwkJCQlpZiAoKExBKDEpPT1BVCkpIHsKKwkJCQkJYW5ub3RhdGlvbj1hbm5vdGF0aW9uKCk7CisJCQkJCXJldFZhbC5hZGRDaGlsZChhbm5vdGF0aW9uKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWJyZWFrIF9sb29wMTQ7CisJCQkJfQorCQkJCQorCQkJfSB3aGlsZSAodHJ1ZSk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF81KTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgUXVhbGlmaWVkSUQgIHF1YWxpZmllZElEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBRdWFsaWZpZWRJRCByZXRWYWwgPSBuZXcgUXVhbGlmaWVkSUQoKSA7CisJCQorCQlUb2tlbiAgaWQxID0gbnVsbDsKKwkJVG9rZW4gIGlkbiA9IG51bGw7CisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJUWlkU2VwYXJhdG9yIHFpZFNlcGFyYXRvciA9IG51bGw7CisJCQlpZDEgPSBMVCgxKTsKKwkJCW1hdGNoKElEKTsKKwkJCXJldFZhbC5hZGRDaGlsZChjcmVhdGVUb2tlbkluZm8oaWQxKSk7CisJCQl7CisJCQlfbG9vcDU6CisJCQlkbyB7CisJCQkJaWYgKChMQSgxKT09RE9UfHxMQSgxKT09RE9MTEFSKSkgeworCQkJCQlxaWRTZXBhcmF0b3I9cWlkU2VwYXJhdG9yKCk7CisJCQkJCWlkbiA9IExUKDEpOworCQkJCQltYXRjaChJRCk7CisJCQkJCXJldFZhbC5hZGRDaGlsZChxaWRTZXBhcmF0b3IpOyByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGlkbikpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJYnJlYWsgX2xvb3A1OworCQkJCX0KKwkJCQkKKwkJCX0gd2hpbGUgKHRydWUpOworCQkJfQorCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNik7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIFFpZFNlcGFyYXRvciAgcWlkU2VwYXJhdG9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBRaWRTZXBhcmF0b3IgcmV0VmFsID0gbnVsbCA7CisJCQorCQlUb2tlbiB0b2sgPSBMVCgxKTsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBET1Q6CisJCQl7CisJCQkJbWF0Y2goRE9UKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgRE9MTEFSOgorCQkJeworCQkJCW1hdGNoKERPTExBUik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJeworCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7CisJCQl9CisJCQl9CisJCQl9CisJCQlyZXRWYWwgPSBuZXcgUWlkU2VwYXJhdG9yKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzcpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCAgc3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHJldFZhbCA9IG51bGwgOworCQkKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBTVFJJTkdfTElURVJBTDoKKwkJCXsKKwkJCQlyZXRWYWw9c3RyaW5nTGl0ZXJhbENvbnRhaW5lcigpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBJRDoKKwkJCXsKKwkJCQlyZXRWYWw9cXVhbGlmaWVkSURDb250YWluZXIoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzgpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBTdHJpbmdMaXRlcmFsQ29udGFpbmVyICBzdHJpbmdMaXRlcmFsQ29udGFpbmVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBTdHJpbmdMaXRlcmFsQ29udGFpbmVyIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIHN0cmluZ19saXRlcmFsID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlzdHJpbmdfbGl0ZXJhbCA9IExUKDEpOworCQkJbWF0Y2goU1RSSU5HX0xJVEVSQUwpOworCQkJcmV0VmFsID0gbmV3IFN0cmluZ0xpdGVyYWxDb250YWluZXIoY3JlYXRlVG9rZW5JbmZvKHN0cmluZ19saXRlcmFsKSk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF84KTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgUXVhbGlmaWVkSURDb250YWluZXIgIHF1YWxpZmllZElEQ29udGFpbmVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBRdWFsaWZpZWRJRENvbnRhaW5lciByZXRWYWwgPSBudWxsIDsKKwkJCisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJUXVhbGlmaWVkSUQgcXVhbGlmaWVkSUQgPSBudWxsOworCQkJcXVhbGlmaWVkSUQ9cXVhbGlmaWVkSUQoKTsKKwkJCXJldFZhbCA9IG5ldyBRdWFsaWZpZWRJRENvbnRhaW5lcihxdWFsaWZpZWRJRCk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF84KTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgQW5ub3RhdGlvbiAgYW5ub3RhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgQW5ub3RhdGlvbiByZXRWYWwgPSBudWxsIDsKKwkJCisJCVRva2VuICBhdCA9IG51bGw7CisJCVRva2VuICBscGFyZW4gPSBudWxsOworCQlUb2tlbiAgcnBhcmVuID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBzb3VyY2UgPSBudWxsOyBLZXlFcXVhbHNWYWx1ZUxpc3Qga2V5RXF1YWxzVmFsdWVMaXN0ID0gbnVsbDsKKwkJCWF0ID0gTFQoMSk7CisJCQltYXRjaChBVCk7CisJCQlzb3VyY2U9c3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKTsKKwkJCWxwYXJlbiA9IExUKDEpOworCQkJbWF0Y2goTFBBUkVOKTsKKwkJCWtleUVxdWFsc1ZhbHVlTGlzdD1rZXlFcXVhbHNWYWx1ZUxpc3QoKTsKKwkJCXJwYXJlbiA9IExUKDEpOworCQkJbWF0Y2goUlBBUkVOKTsKKwkJCXJldFZhbCA9IG5ldyBBbm5vdGF0aW9uKGNyZWF0ZVRva2VuSW5mbyhhdCksIHNvdXJjZSwgY3JlYXRlVG9rZW5JbmZvKGxwYXJlbiksIGtleUVxdWFsc1ZhbHVlTGlzdCwgY3JlYXRlVG9rZW5JbmZvKHJwYXJlbikpOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfOSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIEtleUVxdWFsc1ZhbHVlTGlzdCAga2V5RXF1YWxzVmFsdWVMaXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBLZXlFcXVhbHNWYWx1ZUxpc3QgcmV0VmFsID0gbmV3IEtleUVxdWFsc1ZhbHVlTGlzdCgpIDsKKwkJCisJCVRva2VuICBjb21tYSA9IG51bGw7CisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJS2V5RXF1YWxzVmFsdWUga3YxID0gbnVsbDsgS2V5RXF1YWxzVmFsdWUga3ZuID0gbnVsbDsKKwkJCWt2MT1rZXlFcXVhbHNWYWx1ZSgpOworCQkJcmV0VmFsLmFkZENoaWxkKGt2MSk7CisJCQl7CisJCQlfbG9vcDE4OgorCQkJZG8geworCQkJCWlmICgoTEEoMSk9PUNPTU1BKSkgeworCQkJCQljb21tYSA9IExUKDEpOworCQkJCQltYXRjaChDT01NQSk7CisJCQkJCWt2bj1rZXlFcXVhbHNWYWx1ZSgpOworCQkJCQlyZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGNvbW1hKSk7IHJldFZhbC5hZGRDaGlsZChrdm4pOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJYnJlYWsgX2xvb3AxODsKKwkJCQl9CisJCQkJCisJCQl9IHdoaWxlICh0cnVlKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgS2V5RXF1YWxzVmFsdWUgIGtleUVxdWFsc1ZhbHVlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBLZXlFcXVhbHNWYWx1ZSByZXRWYWwgPSBudWxsIDsKKwkJCisJCVRva2VuICBlcXVhbHMgPSBudWxsOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCVN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIGtleSA9IG51bGw7IFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHZhbHVlID0gbnVsbDsKKwkJCWtleT1zdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCgpOworCQkJZXF1YWxzID0gTFQoMSk7CisJCQltYXRjaChFUVVBTFMpOworCQkJdmFsdWU9c3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKTsKKwkJCXJldFZhbCA9IG5ldyBLZXlFcXVhbHNWYWx1ZShrZXksIGNyZWF0ZVRva2VuSW5mbyhlcXVhbHMpLCB2YWx1ZSk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIEltcG9ydFN0bXQgIGltcG9ydFN0bXQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIEltcG9ydFN0bXQgcmV0VmFsID0gbnVsbCA7CisJCQorCQlUb2tlbiAgaW1wb3J0X0tXID0gbnVsbDsKKwkJVG9rZW4gIGFsaWFzID0gbnVsbDsKKwkJVG9rZW4gIGVxdWFscyA9IG51bGw7CisJCVRva2VuICBzZW1pID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCB1cmkgPSBudWxsOworCQkJaW1wb3J0X0tXID0gTFQoMSk7CisJCQltYXRjaChMSVRFUkFMX2ltcG9ydCk7CisJCQl7CisJCQlpZiAoKExBKDEpPT1JRCkgJiYgKExBKDIpPT1FUVVBTFMpKSB7CisJCQkJYWxpYXMgPSBMVCgxKTsKKwkJCQltYXRjaChJRCk7CisJCQkJZXF1YWxzID0gTFQoMSk7CisJCQkJbWF0Y2goRVFVQUxTKTsKKwkJCX0KKwkJCWVsc2UgaWYgKChMQSgxKT09SUR8fExBKDEpPT1TVFJJTkdfTElURVJBTCkgJiYgKExBKDIpPT1TRU1JfHxMQSgyKT09RE9UfHxMQSgyKT09RE9MTEFSKSkgeworCQkJfQorCQkJZWxzZSB7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCQorCQkJfQorCQkJdXJpPXN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKCk7CisJCQlzZW1pID0gTFQoMSk7CisJCQltYXRjaChTRU1JKTsKKwkJCXJldFZhbCA9IG5ldyBJbXBvcnRTdG10KGNyZWF0ZVRva2VuSW5mbyhpbXBvcnRfS1cpLCBjcmVhdGVUb2tlbkluZm8oYWxpYXMpLCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgdXJpLCBjcmVhdGVUb2tlbkluZm8oc2VtaSkpOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIFRvcExldmVsRGVjbCAgdG9wTGV2ZWxEZWNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBUb3BMZXZlbERlY2wgcmV0VmFsID0gbnVsbCA7CisJCQorCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCUFubm90YXRpb25zIGFubm90YXRpb25zID0gbnVsbDsKKwkJCWFubm90YXRpb25zPWFubm90YXRpb25zKCk7CisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBMSVRFUkFMX3BhY2thZ2U6CisJCQl7CisJCQkJcmV0VmFsPXN1YlBhY2thZ2VEZWNsKGFubm90YXRpb25zKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTElURVJBTF9hYnN0cmFjdDoKKwkJCWNhc2UgTElURVJBTF9jbGFzczoKKwkJCWNhc2UgTElURVJBTF9pbnRlcmZhY2U6CisJCQl7CisJCQkJcmV0VmFsPWNsYXNzRGVjbChhbm5vdGF0aW9ucyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIExJVEVSQUxfdHJhbnNpZW50OgorCQkJY2FzZSBMSVRFUkFMX2RhdGF0eXBlOgorCQkJeworCQkJCXJldFZhbD1kYXRhVHlwZURlY2woYW5ub3RhdGlvbnMpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBMSVRFUkFMX2VudW06CisJCQl7CisJCQkJcmV0VmFsPWVudW1EZWNsKGFubm90YXRpb25zKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTElURVJBTF9tYXBlbnRyeToKKwkJCXsKKwkJCQlyZXRWYWw9bWFwRW50cnlEZWNsKGFubm90YXRpb25zKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEyKTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgU3ViUGFja2FnZURlY2wgIHN1YlBhY2thZ2VEZWNsKAorCQkgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgCisJKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFN1YlBhY2thZ2VEZWNsIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIHBhY2thZ2VfS1cgPSBudWxsOworCQlUb2tlbiAgbmFtZSA9IG51bGw7CisJCVRva2VuICBsY3VybHkgPSBudWxsOworCQlUb2tlbiAgcmN1cmx5ID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlUb3BMZXZlbERlY2xzIHRvcExldmVsRGVjbHMgPSBudWxsOworCQkJcGFja2FnZV9LVyA9IExUKDEpOworCQkJbWF0Y2goTElURVJBTF9wYWNrYWdlKTsKKwkJCW5hbWUgPSBMVCgxKTsKKwkJCW1hdGNoKElEKTsKKwkJCWxjdXJseSA9IExUKDEpOworCQkJbWF0Y2goTENVUkxZKTsKKwkJCXRvcExldmVsRGVjbHM9dG9wTGV2ZWxEZWNscygpOworCQkJcmN1cmx5ID0gTFQoMSk7CisJCQltYXRjaChSQ1VSTFkpOworCQkJcmV0VmFsID0gbmV3IFN1YlBhY2thZ2VEZWNsKGFubm90YXRpb25zLCBjcmVhdGVUb2tlbkluZm8ocGFja2FnZV9LVyksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGxjdXJseSksIHRvcExldmVsRGVjbHMsIGNyZWF0ZVRva2VuSW5mbyhyY3VybHkpKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEyKTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgQ2xhc3NEZWNsICBjbGFzc0RlY2woCisJCSBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyAKKwkpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgQ2xhc3NEZWNsIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIG5hbWUgPSBudWxsOworCQlUb2tlbiAgZXh0ZW5kc19LVyA9IG51bGw7CisJCVRva2VuICBjb2xvbiA9IG51bGw7CisJCVRva2VuICBsY3VybHkgPSBudWxsOworCQlUb2tlbiAgcmN1cmx5ID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlBYnN0cmFjdE1vZGlmaWVyIGFic3RyYWN0TW9kaWZpZXIgPSBudWxsOyBDbGFzc0tpbmQgY2xhc3NLaW5kID0gbnVsbDsgVHlwZVBhcmFtc0luZm8gdHlwZVBhcmFtc0luZm8gPSBudWxsOyBDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQgc3VwZXJUeXBlcyA9IG51bGw7IEJvdW5kRXhjZXB0V2lsZGNhcmQgaW5zdENsYXNzTmFtZSA9IG51bGw7IENsYXNzTWVtYmVyRGVjbHMgY2xhc3NNZW1iZXJEZWNscyA9IG51bGw7CisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBMSVRFUkFMX2Fic3RyYWN0OgorCQkJeworCQkJCWFic3RyYWN0TW9kaWZpZXI9YWJzdHJhY3RNb2RpZmllcigpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBMSVRFUkFMX2NsYXNzOgorCQkJY2FzZSBMSVRFUkFMX2ludGVyZmFjZToKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJCWNsYXNzS2luZD1jbGFzc0tpbmQoKTsKKwkJCW5hbWUgPSBMVCgxKTsKKwkJCW1hdGNoKElEKTsKKwkJCXsKKwkJCXN3aXRjaCAoIExBKDEpKSB7CisJCQljYXNlIExUOgorCQkJeworCQkJCXR5cGVQYXJhbXNJbmZvPXR5cGVQYXJhbXNJbmZvKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIExDVVJMWToKKwkJCWNhc2UgTElURVJBTF9leHRlbmRzOgorCQkJY2FzZSBDT0xPTjoKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJCXsKKwkJCXN3aXRjaCAoIExBKDEpKSB7CisJCQljYXNlIExJVEVSQUxfZXh0ZW5kczoKKwkJCXsKKwkJCQlleHRlbmRzX0tXID0gTFQoMSk7CisJCQkJbWF0Y2goTElURVJBTF9leHRlbmRzKTsKKwkJCQlzdXBlclR5cGVzPWNvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCgpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBMQ1VSTFk6CisJCQljYXNlIENPTE9OOgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOworCQkJfQorCQkJfQorCQkJfQorCQkJeworCQkJc3dpdGNoICggTEEoMSkpIHsKKwkJCWNhc2UgQ09MT046CisJCQl7CisJCQkJY29sb24gPSBMVCgxKTsKKwkJCQltYXRjaChDT0xPTik7CisJCQkJaW5zdENsYXNzTmFtZT1ib3VuZEV4Y2VwdFdpbGRjYXJkKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIExDVVJMWToKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJCWxjdXJseSA9IExUKDEpOworCQkJbWF0Y2goTENVUkxZKTsKKwkJCWNsYXNzTWVtYmVyRGVjbHM9Y2xhc3NNZW1iZXJEZWNscygpOworCQkJcmN1cmx5ID0gTFQoMSk7CisJCQltYXRjaChSQ1VSTFkpOworCQkJcmV0VmFsID0gbmV3IENsYXNzRGVjbChhbm5vdGF0aW9ucywgYWJzdHJhY3RNb2RpZmllciwgY2xhc3NLaW5kLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIHR5cGVQYXJhbXNJbmZvLCBjcmVhdGVUb2tlbkluZm8oZXh0ZW5kc19LVyksIHN1cGVyVHlwZXMsIGNyZWF0ZVRva2VuSW5mbyhjb2xvbiksIGluc3RDbGFzc05hbWUsIGNyZWF0ZVRva2VuSW5mbyhsY3VybHkpLCBjbGFzc01lbWJlckRlY2xzLCBjcmVhdGVUb2tlbkluZm8ocmN1cmx5KSk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMik7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIERhdGFUeXBlRGVjbCAgZGF0YVR5cGVEZWNsKAorCQkgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgCisJKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIERhdGFUeXBlRGVjbCByZXRWYWwgPSBudWxsIDsKKwkJCisJCVRva2VuICBkYXRhdHlwZV9LVyA9IG51bGw7CisJCVRva2VuICBuYW1lID0gbnVsbDsKKwkJVG9rZW4gIGNvbG9uID0gbnVsbDsKKwkJVG9rZW4gIHNlbWkgPSBudWxsOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCVRyYW5zaWVudE1vZGlmaWVyIHRyYW5zaWVudE1vZGlmaWVyID0gbnVsbDsgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgaW5zdENsYXNzTmFtZSA9IG51bGw7CisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBMSVRFUkFMX3RyYW5zaWVudDoKKwkJCXsKKwkJCQl0cmFuc2llbnRNb2RpZmllcj10cmFuc2llbnRNb2RpZmllcigpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBMSVRFUkFMX2RhdGF0eXBlOgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOworCQkJfQorCQkJfQorCQkJfQorCQkJZGF0YXR5cGVfS1cgPSBMVCgxKTsKKwkJCW1hdGNoKExJVEVSQUxfZGF0YXR5cGUpOworCQkJbmFtZSA9IExUKDEpOworCQkJbWF0Y2goSUQpOworCQkJY29sb24gPSBMVCgxKTsKKwkJCW1hdGNoKENPTE9OKTsKKwkJCWluc3RDbGFzc05hbWU9c3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKTsKKwkJCXNlbWkgPSBMVCgxKTsKKwkJCW1hdGNoKFNFTUkpOworCQkJcmV0VmFsID0gbmV3IERhdGFUeXBlRGVjbChhbm5vdGF0aW9ucywgdHJhbnNpZW50TW9kaWZpZXIsIGNyZWF0ZVRva2VuSW5mbyhkYXRhdHlwZV9LVyksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGNvbG9uKSwgaW5zdENsYXNzTmFtZSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEyKTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgRW51bURlY2wgIGVudW1EZWNsKAorCQkgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgCisJKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIEVudW1EZWNsIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIGVudW1fS1cgPSBudWxsOworCQlUb2tlbiAgbmFtZSA9IG51bGw7CisJCVRva2VuICBsY3VybHkgPSBudWxsOworCQlUb2tlbiAgcmN1cmx5ID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlFbnVtTGl0ZXJhbHMgZW51bUxpdGVyYWxzID0gbnVsbDsKKwkJCWVudW1fS1cgPSBMVCgxKTsKKwkJCW1hdGNoKExJVEVSQUxfZW51bSk7CisJCQluYW1lID0gTFQoMSk7CisJCQltYXRjaChJRCk7CisJCQlsY3VybHkgPSBMVCgxKTsKKwkJCW1hdGNoKExDVVJMWSk7CisJCQllbnVtTGl0ZXJhbHM9ZW51bUxpdGVyYWxzKCk7CisJCQlyY3VybHkgPSBMVCgxKTsKKwkJCW1hdGNoKFJDVVJMWSk7CisJCQlyZXRWYWwgPSBuZXcgRW51bURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhlbnVtX0tXKSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8obGN1cmx5KSwgZW51bUxpdGVyYWxzLCBjcmVhdGVUb2tlbkluZm8ocmN1cmx5KSk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMik7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIE1hcEVudHJ5RGVjbCAgbWFwRW50cnlEZWNsKAorCQkgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgCisJKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIE1hcEVudHJ5RGVjbCByZXRWYWwgPSBudWxsIDsKKwkJCisJCVRva2VuICBtYXBlbnRyeV9LVyA9IG51bGw7CisJCVRva2VuICBuYW1lID0gbnVsbDsKKwkJVG9rZW4gIGNvbG9uID0gbnVsbDsKKwkJVG9rZW4gIG1pbnVzX2d0ID0gbnVsbDsKKwkJVG9rZW4gIHNlbWkgPSBudWxsOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCVR5cGVXaXRoTXVsdGkga2V5ID0gbnVsbDsgVHlwZVdpdGhNdWx0aSB2YWx1ZSA9IG51bGw7CisJCQltYXBlbnRyeV9LVyA9IExUKDEpOworCQkJbWF0Y2goTElURVJBTF9tYXBlbnRyeSk7CisJCQluYW1lID0gTFQoMSk7CisJCQltYXRjaChJRCk7CisJCQljb2xvbiA9IExUKDEpOworCQkJbWF0Y2goQ09MT04pOworCQkJa2V5PXR5cGVXaXRoTXVsdGkoKTsKKwkJCW1pbnVzX2d0ID0gTFQoMSk7CisJCQltYXRjaChNSU5VU19HVCk7CisJCQl2YWx1ZT10eXBlV2l0aE11bHRpKCk7CisJCQlzZW1pID0gTFQoMSk7CisJCQltYXRjaChTRU1JKTsKKwkJCXJldFZhbCA9IG5ldyBNYXBFbnRyeURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhtYXBlbnRyeV9LVyksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGNvbG9uKSwga2V5LCBjcmVhdGVUb2tlbkluZm8obWludXNfZ3QpLCB2YWx1ZSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEyKTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgQWJzdHJhY3RNb2RpZmllciAgYWJzdHJhY3RNb2RpZmllcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgQWJzdHJhY3RNb2RpZmllciByZXRWYWwgPSBudWxsIDsKKwkJCisJCVRva2VuICBhYnN0cmFjdF9LVyA9IG51bGw7CisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJYWJzdHJhY3RfS1cgPSBMVCgxKTsKKwkJCW1hdGNoKExJVEVSQUxfYWJzdHJhY3QpOworCQkJcmV0VmFsID0gbmV3IEFic3RyYWN0TW9kaWZpZXIoY3JlYXRlVG9rZW5JbmZvKGFic3RyYWN0X0tXKSk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMyk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIENsYXNzS2luZCAgY2xhc3NLaW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBDbGFzc0tpbmQgcmV0VmFsID0gbnVsbCA7CisJCQorCQlUb2tlbiB0b2sgPSBMVCgxKTsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBMSVRFUkFMX2NsYXNzOgorCQkJeworCQkJCW1hdGNoKExJVEVSQUxfY2xhc3MpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBMSVRFUkFMX2ludGVyZmFjZToKKwkJCXsKKwkJCQltYXRjaChMSVRFUkFMX2ludGVyZmFjZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJeworCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7CisJCQl9CisJCQl9CisJCQl9CisJCQlyZXRWYWwgPSBuZXcgQ2xhc3NLaW5kKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzcpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBUeXBlUGFyYW1zSW5mbyAgdHlwZVBhcmFtc0luZm8oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFR5cGVQYXJhbXNJbmZvIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIGx0ID0gbnVsbDsKKwkJVG9rZW4gIGd0ID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlPbmVPck1vcmVUeXBlUGFyYW1zIG9uZU9yTW9yZVR5cGVQYXJhbXMgPSBudWxsOworCQkJbHQgPSBMVCgxKTsKKwkJCW1hdGNoKExUKTsKKwkJCW9uZU9yTW9yZVR5cGVQYXJhbXM9b25lT3JNb3JlVHlwZVBhcmFtcygpOworCQkJZ3QgPSBMVCgxKTsKKwkJCW1hdGNoKEdUKTsKKwkJCXJldFZhbCA9IG5ldyBUeXBlUGFyYW1zSW5mbyhjcmVhdGVUb2tlbkluZm8obHQpLCBvbmVPck1vcmVUeXBlUGFyYW1zLCBjcmVhdGVUb2tlbkluZm8oZ3QpKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzE0KTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgQ29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkICBjb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCByZXRWYWwgPSBuZXcgQ29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkKCkgOworCQkKKwkJVG9rZW4gIGNvbW1hID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlCb3VuZEV4Y2VwdFdpbGRjYXJkIHRiMSA9IG51bGw7IEJvdW5kRXhjZXB0V2lsZGNhcmQgdGJuID0gbnVsbDsKKwkJCXRiMT1ib3VuZEV4Y2VwdFdpbGRjYXJkKCk7CisJCQlyZXRWYWwuYWRkQ2hpbGQodGIxKTsKKwkJCXsKKwkJCV9sb29wMzg6CisJCQlkbyB7CisJCQkJaWYgKChMQSgxKT09Q09NTUEpKSB7CisJCQkJCWNvbW1hID0gTFQoMSk7CisJCQkJCW1hdGNoKENPTU1BKTsKKwkJCQkJdGJuPWJvdW5kRXhjZXB0V2lsZGNhcmQoKTsKKwkJCQkJcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhjb21tYSkpOyByZXRWYWwuYWRkQ2hpbGQodGJuKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWJyZWFrIF9sb29wMzg7CisJCQkJfQorCQkJCQorCQkJfSB3aGlsZSAodHJ1ZSk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xNSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIEJvdW5kRXhjZXB0V2lsZGNhcmQgIGJvdW5kRXhjZXB0V2lsZGNhcmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIEJvdW5kRXhjZXB0V2lsZGNhcmQgcmV0VmFsID0gbnVsbCA7CisJCQorCQlUb2tlbiAgbHQgPSBudWxsOworCQlUb2tlbiAgZ3QgPSBudWxsOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCVF1YWxpZmllZElEIHJhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lID0gbnVsbDsgT25lT3JNb3JlVHlwZUFyZ3Mgb25lT3JNb3JlVHlwZUFyZ3MgPSBudWxsOworCQkJcmF3VE5hbWVPclRWYXJPclBhcmFtemVkVE5hbWU9cXVhbGlmaWVkSUQoKTsKKwkJCXsKKwkJCXN3aXRjaCAoIExBKDEpKSB7CisJCQljYXNlIExUOgorCQkJeworCQkJCWx0ID0gTFQoMSk7CisJCQkJbWF0Y2goTFQpOworCQkJCW9uZU9yTW9yZVR5cGVBcmdzPW9uZU9yTW9yZVR5cGVBcmdzKCk7CisJCQkJZ3QgPSBMVCgxKTsKKwkJCQltYXRjaChHVCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIFNFTUk6CisJCQljYXNlIElEOgorCQkJY2FzZSBDT01NQToKKwkJCWNhc2UgTENVUkxZOgorCQkJY2FzZSBDT0xPTjoKKwkJCWNhc2UgR1Q6CisJCQljYXNlIEFNUDoKKwkJCWNhc2UgTFNRVUFSRToKKwkJCWNhc2UgSEFTSDoKKwkJCWNhc2UgTUlOVVNfR1Q6CisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJeworCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7CisJCQl9CisJCQl9CisJCQl9CisJCQlyZXRWYWwgPSBuZXcgQm91bmRFeGNlcHRXaWxkY2FyZChyYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSwgY3JlYXRlVG9rZW5JbmZvKGx0KSwgb25lT3JNb3JlVHlwZUFyZ3MsIGNyZWF0ZVRva2VuSW5mbyhndCkpOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTYpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBDbGFzc01lbWJlckRlY2xzICBjbGFzc01lbWJlckRlY2xzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBDbGFzc01lbWJlckRlY2xzIHJldFZhbCA9IG5ldyBDbGFzc01lbWJlckRlY2xzKCkgOworCQkKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlDbGFzc01lbWJlckRlY2wgY2xhc3NNZW1iZXJEZWNsID0gbnVsbDsKKwkJCXsKKwkJCV9sb29wNjU6CisJCQlkbyB7CisJCQkJaWYgKChfdG9rZW5TZXRfMTcubWVtYmVyKExBKDEpKSkpIHsKKwkJCQkJY2xhc3NNZW1iZXJEZWNsPWNsYXNzTWVtYmVyRGVjbCgpOworCQkJCQlyZXRWYWwuYWRkQ2hpbGQoY2xhc3NNZW1iZXJEZWNsKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWJyZWFrIF9sb29wNjU7CisJCQkJfQorCQkJCQorCQkJfSB3aGlsZSAodHJ1ZSk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xOCk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIE9uZU9yTW9yZVR5cGVQYXJhbXMgIG9uZU9yTW9yZVR5cGVQYXJhbXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIE9uZU9yTW9yZVR5cGVQYXJhbXMgcmV0VmFsID0gbmV3IE9uZU9yTW9yZVR5cGVQYXJhbXMoKSA7CisJCQorCQlUb2tlbiAgY29tbWEgPSBudWxsOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCVR5cGVQYXJhbSB0cDEgPSBudWxsOyBUeXBlUGFyYW0gdHBuID0gbnVsbDsKKwkJCXRwMT10eXBlUGFyYW0oKTsKKwkJCXJldFZhbC5hZGRDaGlsZCh0cDEpOworCQkJeworCQkJX2xvb3A0NToKKwkJCWRvIHsKKwkJCQlpZiAoKExBKDEpPT1DT01NQSkpIHsKKwkJCQkJY29tbWEgPSBMVCgxKTsKKwkJCQkJbWF0Y2goQ09NTUEpOworCQkJCQl0cG49dHlwZVBhcmFtKCk7CisJCQkJCXJldFZhbC5hZGRDaGlsZChjcmVhdGVUb2tlbkluZm8oY29tbWEpKTsgcmV0VmFsLmFkZENoaWxkKHRwbik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlicmVhayBfbG9vcDQ1OworCQkJCX0KKwkJCQkKKwkJCX0gd2hpbGUgKHRydWUpOworCQkJfQorCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTkpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBUeXBlUGFyYW0gIHR5cGVQYXJhbSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgVHlwZVBhcmFtIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIHR5cGVWYXJOYW1lID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlUeXBlQm91bmRzSW5mbyB0eXBlQm91bmRzSW5mbyA9IG51bGw7CisJCQl0eXBlVmFyTmFtZSA9IExUKDEpOworCQkJbWF0Y2goSUQpOworCQkJeworCQkJc3dpdGNoICggTEEoMSkpIHsKKwkJCWNhc2UgTElURVJBTF9leHRlbmRzOgorCQkJeworCQkJCXR5cGVCb3VuZHNJbmZvPXR5cGVCb3VuZHNJbmZvKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIENPTU1BOgorCQkJY2FzZSBHVDoKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJCXJldFZhbCA9IG5ldyBUeXBlUGFyYW0oY3JlYXRlVG9rZW5JbmZvKHR5cGVWYXJOYW1lKSwgdHlwZUJvdW5kc0luZm8pOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjApOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBUeXBlQm91bmRzSW5mbyAgdHlwZUJvdW5kc0luZm8oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFR5cGVCb3VuZHNJbmZvIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIGV4dGVuZHNfS1cgPSBudWxsOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCU9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMgPSBudWxsOworCQkJZXh0ZW5kc19LVyA9IExUKDEpOworCQkJbWF0Y2goTElURVJBTF9leHRlbmRzKTsKKwkJCW9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcz1vbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMoKTsKKwkJCXJldFZhbCA9IG5ldyBUeXBlQm91bmRzSW5mbyhjcmVhdGVUb2tlbkluZm8oZXh0ZW5kc19LVyksIG9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMCk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIE9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyAgb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBPbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMgcmV0VmFsID0gbmV3IE9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcygpIDsKKwkJCisJCVRva2VuICBhbXAgPSBudWxsOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCUJvdW5kRXhjZXB0V2lsZGNhcmQgdGIxID0gbnVsbDsgQm91bmRFeGNlcHRXaWxkY2FyZCB0Ym4gPSBudWxsOworCQkJdGIxPWJvdW5kRXhjZXB0V2lsZGNhcmQoKTsKKwkJCXJldFZhbC5hZGRDaGlsZCh0YjEpOworCQkJeworCQkJX2xvb3A1MToKKwkJCWRvIHsKKwkJCQlpZiAoKExBKDEpPT1BTVApKSB7CisJCQkJCWFtcCA9IExUKDEpOworCQkJCQltYXRjaChBTVApOworCQkJCQl0Ym49Ym91bmRFeGNlcHRXaWxkY2FyZCgpOworCQkJCQlyZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGFtcCkpOyByZXRWYWwuYWRkQ2hpbGQodGJuKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWJyZWFrIF9sb29wNTE7CisJCQkJfQorCQkJCQorCQkJfSB3aGlsZSAodHJ1ZSk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMCk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIE9uZU9yTW9yZVR5cGVBcmdzICBvbmVPck1vcmVUeXBlQXJncygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgT25lT3JNb3JlVHlwZUFyZ3MgcmV0VmFsID0gbmV3IE9uZU9yTW9yZVR5cGVBcmdzKCkgOworCQkKKwkJVG9rZW4gIGNvbW1hID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlUeXBlQXJnIHRhMSA9IG51bGw7IFR5cGVBcmcgdGFuID0gbnVsbDsKKwkJCXRhMT10eXBlQXJnKCk7CisJCQlyZXRWYWwuYWRkQ2hpbGQodGExKTsKKwkJCXsKKwkJCV9sb29wNTY6CisJCQlkbyB7CisJCQkJaWYgKChMQSgxKT09Q09NTUEpKSB7CisJCQkJCWNvbW1hID0gTFQoMSk7CisJCQkJCW1hdGNoKENPTU1BKTsKKwkJCQkJdGFuPXR5cGVBcmcoKTsKKwkJCQkJcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhjb21tYSkpOyByZXRWYWwuYWRkQ2hpbGQodGFuKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWJyZWFrIF9sb29wNTY7CisJCQkJfQorCQkJCQorCQkJfSB3aGlsZSAodHJ1ZSk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xOSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIFR5cGVBcmcgIHR5cGVBcmcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFR5cGVBcmcgcmV0VmFsID0gbnVsbCA7CisJCQorCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCXsKKwkJCXN3aXRjaCAoIExBKDEpKSB7CisJCQljYXNlIElEOgorCQkJeworCQkJCXJldFZhbD1ib3VuZEV4Y2VwdFdpbGRjYXJkKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIFFNQVJLOgorCQkJeworCQkJCXJldFZhbD13aWxkY2FyZCgpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOworCQkJfQorCQkJfQorCQkJfQorCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjApOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBXaWxkY2FyZCAgd2lsZGNhcmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFdpbGRjYXJkIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIHFtYXJrID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlFeHRlbmRzT3JTdXBlciBleHRlbmRzT3JTdXBlciA9IG51bGw7IEJvdW5kRXhjZXB0V2lsZGNhcmQgYm91bmRFeGNlcHRXaWxkY2FyZCA9IG51bGw7CisJCQlxbWFyayA9IExUKDEpOworCQkJbWF0Y2goUU1BUkspOworCQkJeworCQkJc3dpdGNoICggTEEoMSkpIHsKKwkJCWNhc2UgTElURVJBTF9leHRlbmRzOgorCQkJY2FzZSBMSVRFUkFMX3N1cGVyOgorCQkJeworCQkJCWV4dGVuZHNPclN1cGVyPWV4dGVuZHNPclN1cGVyKCk7CisJCQkJYm91bmRFeGNlcHRXaWxkY2FyZD1ib3VuZEV4Y2VwdFdpbGRjYXJkKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIENPTU1BOgorCQkJY2FzZSBHVDoKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJCXJldFZhbCA9IG5ldyBXaWxkY2FyZChjcmVhdGVUb2tlbkluZm8ocW1hcmspLCBleHRlbmRzT3JTdXBlciwgYm91bmRFeGNlcHRXaWxkY2FyZCk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMCk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIEV4dGVuZHNPclN1cGVyICBleHRlbmRzT3JTdXBlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgRXh0ZW5kc09yU3VwZXIgcmV0VmFsID0gbnVsbCA7CisJCQorCQlUb2tlbiB0b2sgPSBMVCgxKTsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBMSVRFUkFMX2V4dGVuZHM6CisJCQl7CisJCQkJbWF0Y2goTElURVJBTF9leHRlbmRzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTElURVJBTF9zdXBlcjoKKwkJCXsKKwkJCQltYXRjaChMSVRFUkFMX3N1cGVyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJCXJldFZhbCA9IG5ldyBFeHRlbmRzT3JTdXBlcihjcmVhdGVUb2tlbkluZm8odG9rKSk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF83KTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgQ2xhc3NNZW1iZXJEZWNsICBjbGFzc01lbWJlckRlY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIENsYXNzTWVtYmVyRGVjbCByZXRWYWwgPSBudWxsIDsKKwkJCisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgPSBudWxsOyBNb2RpZmllcnMgbW9kaWZpZXJzID0gbnVsbDsKKwkJCWFubm90YXRpb25zPWFubm90YXRpb25zKCk7CisJCQltb2RpZmllcnM9bW9kaWZpZXJzKCk7CisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBMSVRFUkFMX2F0dHI6CisJCQl7CisJCQkJcmV0VmFsPWF0dHJpYnV0ZShhbm5vdGF0aW9ucywgbW9kaWZpZXJzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTElURVJBTF9yZWY6CisJCQljYXNlIExJVEVSQUxfdmFsOgorCQkJeworCQkJCXJldFZhbD1yZWZlcmVuY2UoYW5ub3RhdGlvbnMsIG1vZGlmaWVycyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIExJVEVSQUxfb3A6CisJCQl7CisJCQkJcmV0VmFsPW9wZXJhdGlvbihhbm5vdGF0aW9ucywgbW9kaWZpZXJzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIxKTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgTW9kaWZpZXJzICBtb2RpZmllcnMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIE1vZGlmaWVycyByZXRWYWwgPSBuZXcgTW9kaWZpZXJzKCkgOworCQkKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlPcHROZWdhdGVkTW9kaWZpZXIgb3B0TmVnYXRlZE1vZGlmaWVyID0gbnVsbDsKKwkJCXsKKwkJCV9sb29wODQ6CisJCQlkbyB7CisJCQkJaWYgKCgoTEEoMSkgPj0gQkFORyAmJiBMQSgxKSA8PSBMSVRFUkFMX2lkKSkpIHsKKwkJCQkJb3B0TmVnYXRlZE1vZGlmaWVyPW9wdE5lZ2F0ZWRNb2RpZmllcigpOworCQkJCQlyZXRWYWwuYWRkQ2hpbGQob3B0TmVnYXRlZE1vZGlmaWVyKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWJyZWFrIF9sb29wODQ7CisJCQkJfQorCQkJCQorCQkJfSB3aGlsZSAodHJ1ZSk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMik7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIEF0dHJpYnV0ZSAgYXR0cmlidXRlKAorCQkgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMsIE1vZGlmaWVycyBtb2RpZmllcnMgCisJKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIEF0dHJpYnV0ZSByZXRWYWwgPSBudWxsIDsKKwkJCisJCVRva2VuICBhdHRyX0tXID0gbnVsbDsKKwkJVG9rZW4gIG5hbWUgPSBudWxsOworCQlUb2tlbiAgZXF1YWxzID0gbnVsbDsKKwkJVG9rZW4gIHNlbWkgPSBudWxsOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCVR5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSA9IG51bGw7IERlZmF1bHRWYWx1ZUV4cHIgZGVmYXVsdFZhbHVlRXhwciA9IG51bGw7CisJCQlhdHRyX0tXID0gTFQoMSk7CisJCQltYXRjaChMSVRFUkFMX2F0dHIpOworCQkJdHlwZVdpdGhNdWx0aT10eXBlV2l0aE11bHRpKCk7CisJCQluYW1lID0gTFQoMSk7CisJCQltYXRjaChJRCk7CisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBFUVVBTFM6CisJCQl7CisJCQkJZXF1YWxzID0gTFQoMSk7CisJCQkJbWF0Y2goRVFVQUxTKTsKKwkJCQlkZWZhdWx0VmFsdWVFeHByPWRlZmF1bHRWYWx1ZUV4cHIoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgU0VNSToKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJCXNlbWkgPSBMVCgxKTsKKwkJCW1hdGNoKFNFTUkpOworCQkJcmV0VmFsID0gbmV3IEF0dHJpYnV0ZShhbm5vdGF0aW9ucywgbW9kaWZpZXJzLCBjcmVhdGVUb2tlbkluZm8oYXR0cl9LVyksIHR5cGVXaXRoTXVsdGksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGVxdWFscyksIGRlZmF1bHRWYWx1ZUV4cHIsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIFJlZmVyZW5jZSAgcmVmZXJlbmNlKAorCQkgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMsIE1vZGlmaWVycyBtb2RpZmllcnMgCisJKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFJlZmVyZW5jZSByZXRWYWwgPSBudWxsIDsKKwkJCisJCVRva2VuICBoYXNoID0gbnVsbDsKKwkJVG9rZW4gIG9wcG9zaXRlTmFtZSA9IG51bGw7CisJCVRva2VuICBuYW1lID0gbnVsbDsKKwkJVG9rZW4gIHNlbWkgPSBudWxsOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCVJlZmVyZW5jZUtpbmQgcmVmZXJlbmNlS2luZCA9IG51bGw7IFR5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSA9IG51bGw7CisJCQlyZWZlcmVuY2VLaW5kPXJlZmVyZW5jZUtpbmQoKTsKKwkJCXR5cGVXaXRoTXVsdGk9dHlwZVdpdGhNdWx0aSgpOworCQkJeworCQkJc3dpdGNoICggTEEoMSkpIHsKKwkJCWNhc2UgSEFTSDoKKwkJCXsKKwkJCQloYXNoID0gTFQoMSk7CisJCQkJbWF0Y2goSEFTSCk7CisJCQkJb3Bwb3NpdGVOYW1lID0gTFQoMSk7CisJCQkJbWF0Y2goSUQpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBJRDoKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJCW5hbWUgPSBMVCgxKTsKKwkJCW1hdGNoKElEKTsKKwkJCXNlbWkgPSBMVCgxKTsKKwkJCW1hdGNoKFNFTUkpOworCQkJcmV0VmFsID0gbmV3IFJlZmVyZW5jZShhbm5vdGF0aW9ucywgbW9kaWZpZXJzLCByZWZlcmVuY2VLaW5kLCB0eXBlV2l0aE11bHRpLCBjcmVhdGVUb2tlbkluZm8oaGFzaCksIGNyZWF0ZVRva2VuSW5mbyhvcHBvc2l0ZU5hbWUpLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIE9wZXJhdGlvbiAgb3BlcmF0aW9uKAorCQkgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMsIE1vZGlmaWVycyBtb2RpZmllcnMgCisJKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIE9wZXJhdGlvbiByZXRWYWwgPSBudWxsIDsKKwkJCisJCVRva2VuICBvcF9LVyA9IG51bGw7CisJCVRva2VuICBuYW1lID0gbnVsbDsKKwkJVG9rZW4gIGxwYXJlbiA9IG51bGw7CisJCVRva2VuICBycGFyZW4gPSBudWxsOworCQlUb2tlbiAgdGhyb3dzX0tXID0gbnVsbDsKKwkJVG9rZW4gIHNlbWkgPSBudWxsOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCVR5cGVQYXJhbXNJbmZvIHR5cGVQYXJhbXNJbmZvID0gbnVsbDsgUmVzdWx0VHlwZSByZXNUeXBlID0gbnVsbDsgUGFyYW1zIHBhcmFtcyA9IG51bGw7IENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBleGNlcHRpb25zID0gbnVsbDsKKwkJCW9wX0tXID0gTFQoMSk7CisJCQltYXRjaChMSVRFUkFMX29wKTsKKwkJCXsKKwkJCXN3aXRjaCAoIExBKDEpKSB7CisJCQljYXNlIExUOgorCQkJeworCQkJCXR5cGVQYXJhbXNJbmZvPXR5cGVQYXJhbXNJbmZvKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIElEOgorCQkJY2FzZSBMSVRFUkFMX3ZvaWQ6CisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJeworCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7CisJCQl9CisJCQl9CisJCQl9CisJCQlyZXNUeXBlPXJlc3VsdFR5cGUoKTsKKwkJCW5hbWUgPSBMVCgxKTsKKwkJCW1hdGNoKElEKTsKKwkJCWxwYXJlbiA9IExUKDEpOworCQkJbWF0Y2goTFBBUkVOKTsKKwkJCXsKKwkJCXN3aXRjaCAoIExBKDEpKSB7CisJCQljYXNlIElEOgorCQkJY2FzZSBBVDoKKwkJCWNhc2UgQkFORzoKKwkJCWNhc2UgTElURVJBTF9yZWFkb25seToKKwkJCWNhc2UgTElURVJBTF92b2xhdGlsZToKKwkJCWNhc2UgTElURVJBTF90cmFuc2llbnQ6CisJCQljYXNlIExJVEVSQUxfdW5zZXR0YWJsZToKKwkJCWNhc2UgTElURVJBTF9kZXJpdmVkOgorCQkJY2FzZSBMSVRFUkFMX3VuaXF1ZToKKwkJCWNhc2UgTElURVJBTF9vcmRlcmVkOgorCQkJY2FzZSBMSVRFUkFMX3Jlc29sdmU6CisJCQljYXNlIExJVEVSQUxfaWQ6CisJCQl7CisJCQkJcGFyYW1zPXBhcmFtcygpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBSUEFSRU46CisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJeworCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7CisJCQl9CisJCQl9CisJCQl9CisJCQlycGFyZW4gPSBMVCgxKTsKKwkJCW1hdGNoKFJQQVJFTik7CisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBMSVRFUkFMX3Rocm93czoKKwkJCXsKKwkJCQl0aHJvd3NfS1cgPSBMVCgxKTsKKwkJCQltYXRjaChMSVRFUkFMX3Rocm93cyk7CisJCQkJZXhjZXB0aW9ucz1jb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgU0VNSToKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJCXNlbWkgPSBMVCgxKTsKKwkJCW1hdGNoKFNFTUkpOworCQkJcmV0VmFsID0gbmV3IE9wZXJhdGlvbihhbm5vdGF0aW9ucywgbW9kaWZpZXJzLCBjcmVhdGVUb2tlbkluZm8ob3BfS1cpLCB0eXBlUGFyYW1zSW5mbywgcmVzVHlwZSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8obHBhcmVuKSwgcGFyYW1zLCBjcmVhdGVUb2tlbkluZm8ocnBhcmVuKSwgY3JlYXRlVG9rZW5JbmZvKHRocm93c19LVyksIGV4Y2VwdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIFR5cGVXaXRoTXVsdGkgIHR5cGVXaXRoTXVsdGkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFR5cGVXaXRoTXVsdGkgcmV0VmFsID0gbnVsbCA7CisJCQorCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCUJvdW5kRXhjZXB0V2lsZGNhcmQgbmFtZSA9IG51bGw7IE11bHRpcGxpY2l0eSBtdWx0aXBsaWNpdHkgPSBudWxsOworCQkJbmFtZT1ib3VuZEV4Y2VwdFdpbGRjYXJkKCk7CisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBMU1FVQVJFOgorCQkJeworCQkJCW11bHRpcGxpY2l0eT1tdWx0aXBsaWNpdHkoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgU0VNSToKKwkJCWNhc2UgSUQ6CisJCQljYXNlIEhBU0g6CisJCQljYXNlIE1JTlVTX0dUOgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOworCQkJfQorCQkJfQorCQkJfQorCQkJcmV0VmFsID0gbmV3IFR5cGVXaXRoTXVsdGkobmFtZSwgbXVsdGlwbGljaXR5KTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIzKTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgRGVmYXVsdFZhbHVlRXhwciAgZGVmYXVsdFZhbHVlRXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgRGVmYXVsdFZhbHVlRXhwciByZXRWYWwgPSBudWxsIDsKKwkJCisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJeworCQkJc3dpdGNoICggTEEoMSkpIHsKKwkJCWNhc2UgTElURVJBTF90cnVlOgorCQkJY2FzZSBMSVRFUkFMX2ZhbHNlOgorCQkJeworCQkJCXJldFZhbD1ib29sRXhwcigpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBJTlRfTElURVJBTDoKKwkJCWNhc2UgTUlOVVM6CisJCQl7CisJCQkJcmV0VmFsPWludEV4cHIoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgU1RSSU5HX0xJVEVSQUw6CisJCQl7CisJCQkJcmV0VmFsPXN0cmluZ0V4cHIoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgQ0hBUl9MSVRFUkFMOgorCQkJeworCQkJCXJldFZhbD1jaGFyRXhwcigpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOworCQkJfQorCQkJfQorCQkJfQorCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjQpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBNdWx0aXBsaWNpdHkgIG11bHRpcGxpY2l0eSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgTXVsdGlwbGljaXR5IHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIGxzcXVhcmUgPSBudWxsOworCQlUb2tlbiAgcnNxdWFyZSA9IG51bGw7CisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJTXVsdGlwbGljaXR5RXhwciBtdWx0aXBsaWNpdHlFeHByID0gbnVsbDsKKwkJCWxzcXVhcmUgPSBMVCgxKTsKKwkJCW1hdGNoKExTUVVBUkUpOworCQkJeworCQkJc3dpdGNoICggTEEoMSkpIHsKKwkJCWNhc2UgUU1BUks6CisJCQljYXNlIFNUQVI6CisJCQljYXNlIFBMVVM6CisJCQljYXNlIElOVF9MSVRFUkFMOgorCQkJeworCQkJCW11bHRpcGxpY2l0eUV4cHI9bXVsdGlwbGljaXR5RXhwcigpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBSU1FVQVJFOgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOworCQkJfQorCQkJfQorCQkJfQorCQkJcnNxdWFyZSA9IExUKDEpOworCQkJbWF0Y2goUlNRVUFSRSk7CisJCQlyZXRWYWwgPSBuZXcgTXVsdGlwbGljaXR5KGNyZWF0ZVRva2VuSW5mbyhsc3F1YXJlKSwgbXVsdGlwbGljaXR5RXhwciwgY3JlYXRlVG9rZW5JbmZvKHJzcXVhcmUpKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIzKTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgTXVsdGlwbGljaXR5RXhwciAgbXVsdGlwbGljaXR5RXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgTXVsdGlwbGljaXR5RXhwciByZXRWYWwgPSBudWxsIDsKKwkJCisJCVRva2VuICBkb3RfZG90ID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlTaW1wbGVNdWx0aXBsaWNpdHlFeHByIGxvd2VyQm91bmQgPSBudWxsOyBTaW1wbGVNdWx0aXBsaWNpdHlFeHByIHVwcGVyQm91bmQgPSBudWxsOworCQkJbG93ZXJCb3VuZD1zaW1wbGVNdWx0aXBsaWNpdHlFeHByKCk7CisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBET1RfRE9UOgorCQkJeworCQkJCWRvdF9kb3QgPSBMVCgxKTsKKwkJCQltYXRjaChET1RfRE9UKTsKKwkJCQl1cHBlckJvdW5kPXNpbXBsZU11bHRpcGxpY2l0eUV4cHIoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgUlNRVUFSRToKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJCXJldFZhbCA9IG5ldyBNdWx0aXBsaWNpdHlFeHByKGxvd2VyQm91bmQsIGNyZWF0ZVRva2VuSW5mbyhkb3RfZG90KSwgdXBwZXJCb3VuZCk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yNSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgIHNpbXBsZU11bHRpcGxpY2l0eUV4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgcmV0VmFsID0gbnVsbCA7CisJCQorCQlUb2tlbiB0b2sgPSBMVCgxKTsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBTVEFSOgorCQkJeworCQkJCW1hdGNoKFNUQVIpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBQTFVTOgorCQkJeworCQkJCW1hdGNoKFBMVVMpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBRTUFSSzoKKwkJCXsKKwkJCQltYXRjaChRTUFSSyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIElOVF9MSVRFUkFMOgorCQkJeworCQkJCW1hdGNoKElOVF9MSVRFUkFMKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJCXJldFZhbCA9IG5ldyBTaW1wbGVNdWx0aXBsaWNpdHlFeHByKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI2KTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgUmVmZXJlbmNlS2luZCAgcmVmZXJlbmNlS2luZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgUmVmZXJlbmNlS2luZCByZXRWYWwgPSBudWxsIDsKKwkJCisJCVRva2VuIHRvayA9IExUKDEpOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCXsKKwkJCXN3aXRjaCAoIExBKDEpKSB7CisJCQljYXNlIExJVEVSQUxfcmVmOgorCQkJeworCQkJCW1hdGNoKExJVEVSQUxfcmVmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTElURVJBTF92YWw6CisJCQl7CisJCQkJbWF0Y2goTElURVJBTF92YWwpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOworCQkJfQorCQkJfQorCQkJfQorCQkJcmV0VmFsID0gbmV3IFJlZmVyZW5jZUtpbmQoY3JlYXRlVG9rZW5JbmZvKHRvaykpOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNyk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIE9wdE5lZ2F0ZWRNb2RpZmllciAgb3B0TmVnYXRlZE1vZGlmaWVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBPcHROZWdhdGVkTW9kaWZpZXIgcmV0VmFsID0gbnVsbCA7CisJCQorCQlUb2tlbiAgYmFuZyA9IG51bGw7CisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJTW9kaWZpZXIgbW9kaWZpZXIgPSBudWxsOworCQkJeworCQkJc3dpdGNoICggTEEoMSkpIHsKKwkJCWNhc2UgQkFORzoKKwkJCXsKKwkJCQliYW5nID0gTFQoMSk7CisJCQkJbWF0Y2goQkFORyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIExJVEVSQUxfcmVhZG9ubHk6CisJCQljYXNlIExJVEVSQUxfdm9sYXRpbGU6CisJCQljYXNlIExJVEVSQUxfdHJhbnNpZW50OgorCQkJY2FzZSBMSVRFUkFMX3Vuc2V0dGFibGU6CisJCQljYXNlIExJVEVSQUxfZGVyaXZlZDoKKwkJCWNhc2UgTElURVJBTF91bmlxdWU6CisJCQljYXNlIExJVEVSQUxfb3JkZXJlZDoKKwkJCWNhc2UgTElURVJBTF9yZXNvbHZlOgorCQkJY2FzZSBMSVRFUkFMX2lkOgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOworCQkJfQorCQkJfQorCQkJfQorCQkJbW9kaWZpZXI9bW9kaWZpZXIoKTsKKwkJCXJldFZhbCA9IG5ldyBPcHROZWdhdGVkTW9kaWZpZXIoY3JlYXRlVG9rZW5JbmZvKGJhbmcpLCBtb2RpZmllcik7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yNyk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIE1vZGlmaWVyICBtb2RpZmllcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgTW9kaWZpZXIgcmV0VmFsID0gbnVsbCA7CisJCQorCQlUb2tlbiB0b2sgPSBMVCgxKTsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBMSVRFUkFMX3JlYWRvbmx5OgorCQkJeworCQkJCW1hdGNoKExJVEVSQUxfcmVhZG9ubHkpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBMSVRFUkFMX3ZvbGF0aWxlOgorCQkJeworCQkJCW1hdGNoKExJVEVSQUxfdm9sYXRpbGUpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBMSVRFUkFMX3RyYW5zaWVudDoKKwkJCXsKKwkJCQltYXRjaChMSVRFUkFMX3RyYW5zaWVudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIExJVEVSQUxfdW5zZXR0YWJsZToKKwkJCXsKKwkJCQltYXRjaChMSVRFUkFMX3Vuc2V0dGFibGUpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBMSVRFUkFMX2Rlcml2ZWQ6CisJCQl7CisJCQkJbWF0Y2goTElURVJBTF9kZXJpdmVkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTElURVJBTF91bmlxdWU6CisJCQl7CisJCQkJbWF0Y2goTElURVJBTF91bmlxdWUpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBMSVRFUkFMX29yZGVyZWQ6CisJCQl7CisJCQkJbWF0Y2goTElURVJBTF9vcmRlcmVkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgTElURVJBTF9yZXNvbHZlOgorCQkJeworCQkJCW1hdGNoKExJVEVSQUxfcmVzb2x2ZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIExJVEVSQUxfaWQ6CisJCQl7CisJCQkJbWF0Y2goTElURVJBTF9pZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJeworCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7CisJCQl9CisJCQl9CisJCQl9CisJCQlyZXRWYWwgPSBuZXcgTW9kaWZpZXIoY3JlYXRlVG9rZW5JbmZvKHRvaykpOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjcpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBCb29sRXhwciAgYm9vbEV4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIEJvb2xFeHByIHJldFZhbCA9IG51bGwgOworCQkKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlUcnVlT3JGYWxzZSB0cnVlT3JGYWxzZSA9IG51bGw7CisJCQl0cnVlT3JGYWxzZT10cnVlT3JGYWxzZSgpOworCQkJcmV0VmFsID0gbmV3IEJvb2xFeHByKHRydWVPckZhbHNlKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI0KTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgSW50RXhwciAgaW50RXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgSW50RXhwciByZXRWYWwgPSBudWxsIDsKKwkJCisJCVRva2VuICBtaW51cyA9IG51bGw7CisJCVRva2VuICBpbnRfbGl0ZXJhbCA9IG51bGw7CisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJeworCQkJc3dpdGNoICggTEEoMSkpIHsKKwkJCWNhc2UgTUlOVVM6CisJCQl7CisJCQkJbWludXMgPSBMVCgxKTsKKwkJCQltYXRjaChNSU5VUyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIElOVF9MSVRFUkFMOgorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOworCQkJfQorCQkJfQorCQkJfQorCQkJaW50X2xpdGVyYWwgPSBMVCgxKTsKKwkJCW1hdGNoKElOVF9MSVRFUkFMKTsKKwkJCXJldFZhbCA9IG5ldyBJbnRFeHByKGNyZWF0ZVRva2VuSW5mbyhtaW51cyksIGNyZWF0ZVRva2VuSW5mbyhpbnRfbGl0ZXJhbCkpOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjQpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBTdHJpbmdFeHByICBzdHJpbmdFeHByKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBTdHJpbmdFeHByIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIHN0cmluZ19saXRlcmFsID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlzdHJpbmdfbGl0ZXJhbCA9IExUKDEpOworCQkJbWF0Y2goU1RSSU5HX0xJVEVSQUwpOworCQkJcmV0VmFsID0gbmV3IFN0cmluZ0V4cHIoY3JlYXRlVG9rZW5JbmZvKHN0cmluZ19saXRlcmFsKSk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yNCk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIENoYXJFeHByICBjaGFyRXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgQ2hhckV4cHIgcmV0VmFsID0gbnVsbCA7CisJCQorCQlUb2tlbiAgY2hhcl9saXRlcmFsID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQljaGFyX2xpdGVyYWwgPSBMVCgxKTsKKwkJCW1hdGNoKENIQVJfTElURVJBTCk7CisJCQlyZXRWYWwgPSBuZXcgQ2hhckV4cHIoY3JlYXRlVG9rZW5JbmZvKGNoYXJfbGl0ZXJhbCkpOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjQpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBUcnVlT3JGYWxzZSAgdHJ1ZU9yRmFsc2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFRydWVPckZhbHNlIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gdG9rID0gTFQoMSk7CisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJeworCQkJc3dpdGNoICggTEEoMSkpIHsKKwkJCWNhc2UgTElURVJBTF90cnVlOgorCQkJeworCQkJCW1hdGNoKExJVEVSQUxfdHJ1ZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIExJVEVSQUxfZmFsc2U6CisJCQl7CisJCQkJbWF0Y2goTElURVJBTF9mYWxzZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJeworCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7CisJCQl9CisJCQl9CisJCQl9CisJCQlyZXRWYWwgPSBuZXcgVHJ1ZU9yRmFsc2UoY3JlYXRlVG9rZW5JbmZvKHRvaykpOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjQpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBSZXN1bHRUeXBlICByZXN1bHRUeXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBSZXN1bHRUeXBlIHJldFZhbCA9IG51bGwgOworCQkKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQl7CisJCQlzd2l0Y2ggKCBMQSgxKSkgeworCQkJY2FzZSBJRDoKKwkJCXsKKwkJCQlyZXRWYWw9dHlwZVdpdGhNdWx0aSgpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBMSVRFUkFMX3ZvaWQ6CisJCQl7CisJCQkJcmV0VmFsPXZvaWRDb250YWluZXIoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzcpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBQYXJhbXMgIHBhcmFtcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgUGFyYW1zIHJldFZhbCA9IG5ldyBQYXJhbXMoKSA7CisJCQorCQlUb2tlbiAgY29tbWEgPSBudWxsOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCVBhcmFtIHAxID0gbnVsbDsgUGFyYW0gcG4gPSBudWxsOworCQkJcDE9cGFyYW0oKTsKKwkJCXJldFZhbC5hZGRDaGlsZChwMSk7CisJCQl7CisJCQlfbG9vcDEwNzoKKwkJCWRvIHsKKwkJCQlpZiAoKExBKDEpPT1DT01NQSkpIHsKKwkJCQkJY29tbWEgPSBMVCgxKTsKKwkJCQkJbWF0Y2goQ09NTUEpOworCQkJCQlwbj1wYXJhbSgpOworCQkJCQlyZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGNvbW1hKSk7IHJldFZhbC5hZGRDaGlsZChwbik7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlicmVhayBfbG9vcDEwNzsKKwkJCQl9CisJCQkJCisJCQl9IHdoaWxlICh0cnVlKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsKKwkJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKwkKKwlwdWJsaWMgZmluYWwgVm9pZENvbnRhaW5lciAgdm9pZENvbnRhaW5lcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgVm9pZENvbnRhaW5lciByZXRWYWwgPSBudWxsIDsKKwkJCisJCVRva2VuICB2b2lkX0tXID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQl2b2lkX0tXID0gTFQoMSk7CisJCQltYXRjaChMSVRFUkFMX3ZvaWQpOworCQkJcmV0VmFsID0gbmV3IFZvaWRDb250YWluZXIoY3JlYXRlVG9rZW5JbmZvKHZvaWRfS1cpKTsKKwkJfQorCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXJlcG9ydEVycm9yKGV4KTsKKwkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzcpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBQYXJhbSAgcGFyYW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIFBhcmFtIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIG5hbWUgPSBudWxsOworCQkKKwkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcKKwkJCUFubm90YXRpb25zIGxlYWRpbmdBbm5vdGF0aW9ucyA9IG51bGw7IE1vZGlmaWVycyBtb2RpZmllcnMgPSBudWxsOyBUeXBlV2l0aE11bHRpIHR5cGVXaXRoTXVsdGkgPSBudWxsOyBBbm5vdGF0aW9ucyB0cmFpbGluZ0Fubm90YXRpb25zID0gbnVsbDsKKwkJCWxlYWRpbmdBbm5vdGF0aW9ucz1hbm5vdGF0aW9ucygpOworCQkJbW9kaWZpZXJzPW1vZGlmaWVycygpOworCQkJdHlwZVdpdGhNdWx0aT10eXBlV2l0aE11bHRpKCk7CisJCQluYW1lID0gTFQoMSk7CisJCQltYXRjaChJRCk7CisJCQl0cmFpbGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zKCk7CisJCQlyZXRWYWwgPSBuZXcgUGFyYW0obGVhZGluZ0Fubm90YXRpb25zLCBtb2RpZmllcnMsIHR5cGVXaXRoTXVsdGksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgdHJhaWxpbmdBbm5vdGF0aW9ucyk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIFRyYW5zaWVudE1vZGlmaWVyICB0cmFuc2llbnRNb2RpZmllcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24geworCQkgVHJhbnNpZW50TW9kaWZpZXIgcmV0VmFsID0gbnVsbCA7CisJCQorCQlUb2tlbiAgdHJhbnNpZW50X0tXID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQl0cmFuc2llbnRfS1cgPSBMVCgxKTsKKwkJCW1hdGNoKExJVEVSQUxfdHJhbnNpZW50KTsKKwkJCXJldFZhbCA9IG5ldyBUcmFuc2llbnRNb2RpZmllcihjcmVhdGVUb2tlbkluZm8odHJhbnNpZW50X0tXKSk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yOCk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJcHVibGljIGZpbmFsIEVudW1MaXRlcmFscyAgZW51bUxpdGVyYWxzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7CisJCSBFbnVtTGl0ZXJhbHMgcmV0VmFsID0gbmV3IEVudW1MaXRlcmFscygpIDsKKwkJCisJCQorCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZworCQkJRW51bUxpdGVyYWwgZW51bUxpdGVyYWwgPSBudWxsOworCQkJeworCQkJX2xvb3AxMTU6CisJCQlkbyB7CisJCQkJaWYgKChMQSgxKT09SUR8fExBKDEpPT1BVCkpIHsKKwkJCQkJZW51bUxpdGVyYWw9ZW51bUxpdGVyYWwoKTsKKwkJCQkJcmV0VmFsLmFkZENoaWxkKGVudW1MaXRlcmFsKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWJyZWFrIF9sb29wMTE1OworCQkJCX0KKwkJCQkKKwkJCX0gd2hpbGUgKHRydWUpOworCQkJfQorCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJcmVwb3J0RXJyb3IoZXgpOworCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTgpOworCQl9CisJCXJldHVybiByZXRWYWw7CisJfQorCQorCXB1YmxpYyBmaW5hbCBFbnVtTGl0ZXJhbCAgZW51bUxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJIEVudW1MaXRlcmFsIHJldFZhbCA9IG51bGwgOworCQkKKwkJVG9rZW4gIG5hbWUgPSBudWxsOworCQlUb2tlbiAgZXF1YWxzID0gbnVsbDsKKwkJVG9rZW4gIHZhbCA9IG51bGw7CisJCVRva2VuICBzZW1pID0gbnVsbDsKKwkJCisJCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nCisJCQlBbm5vdGF0aW9ucyBsZWFkaW5nQW5ub3RhdGlvbnMgPSBudWxsOyBBbm5vdGF0aW9ucyB0cmFpbGluZ0Fubm90YXRpb25zID0gbnVsbDsKKwkJCWxlYWRpbmdBbm5vdGF0aW9ucz1hbm5vdGF0aW9ucygpOworCQkJbmFtZSA9IExUKDEpOworCQkJbWF0Y2goSUQpOworCQkJeworCQkJc3dpdGNoICggTEEoMSkpIHsKKwkJCWNhc2UgRVFVQUxTOgorCQkJeworCQkJCWVxdWFscyA9IExUKDEpOworCQkJCW1hdGNoKEVRVUFMUyk7CisJCQkJdmFsID0gTFQoMSk7CisJCQkJbWF0Y2goSU5UX0xJVEVSQUwpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBTRU1JOgorCQkJY2FzZSBBVDoKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQl7CisJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsKKwkJCX0KKwkJCX0KKwkJCX0KKwkJCXRyYWlsaW5nQW5ub3RhdGlvbnM9YW5ub3RhdGlvbnMoKTsKKwkJCXNlbWkgPSBMVCgxKTsKKwkJCW1hdGNoKFNFTUkpOworCQkJcmV0VmFsID0gbmV3IEVudW1MaXRlcmFsKGxlYWRpbmdBbm5vdGF0aW9ucywgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgY3JlYXRlVG9rZW5JbmZvKHZhbCksIHRyYWlsaW5nQW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisJCX0KKwkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQlyZXBvcnRFcnJvcihleCk7CisJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yOSk7CisJCX0KKwkJcmV0dXJuIHJldFZhbDsKKwl9CisJCisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBfdG9rZW5OYW1lcyA9IHsKKwkJIjwwPiIsCisJCSJFT0YiLAorCQkiPDI+IiwKKwkJIk5VTExfVFJFRV9MT09LQUhFQUQiLAorCQkiXCJwYWNrYWdlXCIiLAorCQkiU0VNSSIsCisJCSJJRCIsCisJCSJET1QiLAorCQkiRE9MTEFSIiwKKwkJIlNUUklOR19MSVRFUkFMIiwKKwkJIkFUIiwKKwkJIkxQQVJFTiIsCisJCSJSUEFSRU4iLAorCQkiQ09NTUEiLAorCQkiRVFVQUxTIiwKKwkJIlwiaW1wb3J0XCIiLAorCQkiTENVUkxZIiwKKwkJIlJDVVJMWSIsCisJCSJcImV4dGVuZHNcIiIsCisJCSJDT0xPTiIsCisJCSJcImFic3RyYWN0XCIiLAorCQkiXCJjbGFzc1wiIiwKKwkJIlwiaW50ZXJmYWNlXCIiLAorCQkiTFQiLAorCQkiR1QiLAorCQkiQU1QIiwKKwkJIlFNQVJLIiwKKwkJIlwic3VwZXJcIiIsCisJCSJcImF0dHJcIiIsCisJCSJMU1FVQVJFIiwKKwkJIlJTUVVBUkUiLAorCQkiRE9UX0RPVCIsCisJCSJTVEFSIiwKKwkJIlBMVVMiLAorCQkiSU5UX0xJVEVSQUwiLAorCQkiSEFTSCIsCisJCSJcInJlZlwiIiwKKwkJIlwidmFsXCIiLAorCQkiQkFORyIsCisJCSJcInJlYWRvbmx5XCIiLAorCQkiXCJ2b2xhdGlsZVwiIiwKKwkJIlwidHJhbnNpZW50XCIiLAorCQkiXCJ1bnNldHRhYmxlXCIiLAorCQkiXCJkZXJpdmVkXCIiLAorCQkiXCJ1bmlxdWVcIiIsCisJCSJcIm9yZGVyZWRcIiIsCisJCSJcInJlc29sdmVcIiIsCisJCSJcImlkXCIiLAorCQkiXCJ0cnVlXCIiLAorCQkiXCJmYWxzZVwiIiwKKwkJIk1JTlVTIiwKKwkJIkNIQVJfTElURVJBTCIsCisJCSJcIm9wXCIiLAorCQkiXCJ0aHJvd3NcIiIsCisJCSJcInZvaWRcIiIsCisJCSJcImRhdGF0eXBlXCIiLAorCQkiXCJlbnVtXCIiLAorCQkiXCJtYXBlbnRyeVwiIiwKKwkJIk1JTlVTX0dUIiwKKwkJIkdUX0xUIiwKKwkJIkxUX0dUIiwKKwkJIkVTQyIsCisJCSJESUdJVCIsCisJCSJXUyIsCisJCSJTSU5HTEVfTElORV9DT01NRU5UIiwKKwkJIk1VTFRJX0xJTkVfQ09NTUVOVCIKKwl9OworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8wKCkgeworCQlsb25nW10gZGF0YSA9IHsgMkwsIDBMfTsKKwkJcmV0dXJuIGRhdGE7CisJfQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8wID0gbmV3IEJpdFNldChta190b2tlblNldF8wKCkpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8xKCkgeworCQlsb25nW10gZGF0YSA9IHsgMjUyMjAzNzc4MTYzMzc3MTcwTCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzEgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzEoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzIoKSB7CisJCWxvbmdbXSBkYXRhID0geyAyNTIyMDM3NzgxNjMzNDQ0MDJMLCAwTH07CisJCXJldHVybiBkYXRhOworCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMigpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMygpIHsKKwkJbG9uZ1tdIGRhdGEgPSB7IDI1MjIwMzc3ODE2MzM0NDQwMEwsIDBMfTsKKwkJcmV0dXJuIGRhdGE7CisJfQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zID0gbmV3IEJpdFNldChta190b2tlblNldF8zKCkpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF80KCkgeworCQlsb25nW10gZGF0YSA9IHsgMTMxMDc0TCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzQoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzUoKSB7CisJCWxvbmdbXSBkYXRhID0geyAyNTY5ODY1ODUyOTMxNDAwODBMLCAwTH07CisJCXJldHVybiBkYXRhOworCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNSgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNigpIHsKKwkJbG9uZ1tdIGRhdGEgPSB7IDI4ODIzMDQxMTEwNzY2MTkyMEwsIDBMfTsKKwkJcmV0dXJuIGRhdGE7CisJfQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF82ID0gbmV3IEJpdFNldChta190b2tlblNldF82KCkpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF83KCkgeworCQlsb25nW10gZGF0YSA9IHsgNjRMLCAwTH07CisJCXJldHVybiBkYXRhOworCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNygpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfOCgpIHsKKwkJbG9uZ1tdIGRhdGEgPSB7IDMwNzUyTCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzggPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzgoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzkoKSB7CisJCWxvbmdbXSBkYXRhID0geyAyNTY5ODY1ODUyOTMxNDExMDRMLCAwTH07CisJCXJldHVybiBkYXRhOworCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfOSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfOSgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTAoKSB7CisJCWxvbmdbXSBkYXRhID0geyA0MDk2TCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzEwID0gbmV3IEJpdFNldChta190b2tlblNldF8xMCgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTEoKSB7CisJCWxvbmdbXSBkYXRhID0geyAxMjI4OEwsIDBMfTsKKwkJcmV0dXJuIGRhdGE7CisJfQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8xMSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMTEoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzEyKCkgeworCQlsb25nW10gZGF0YSA9IHsgMjUyMjAzNzc4MTYzNDc1NDc0TCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzEyID0gbmV3IEJpdFNldChta190b2tlblNldF8xMigpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTMoKSB7CisJCWxvbmdbXSBkYXRhID0geyA2MjkxNDU2TCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzEzID0gbmV3IEJpdFNldChta190b2tlblNldF8xMygpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTQoKSB7CisJCWxvbmdbXSBkYXRhID0geyAxODAxNDM5ODUxMDMzNDAxNkwsIDBMfTsKKwkJcmV0dXJuIGRhdGE7CisJfQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8xNCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMTQoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzE1KCkgeworCQlsb25nW10gZGF0YSA9IHsgNTg5ODU2TCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzE1ID0gbmV3IEJpdFNldChta190b2tlblNldF8xNSgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTYoKSB7CisJCWxvbmdbXSBkYXRhID0geyAyODgyMzA0MTEwOTkyNTA3ODRMLCAwTH07CisJCXJldHVybiBkYXRhOworCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTYgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzE2KCkpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8xNygpIHsKKwkJbG9uZ1tdIGRhdGEgPSB7IDQ3ODUwMDYxNTMwNDA4OTZMLCAwTH07CisJCXJldHVybiBkYXRhOworCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTcgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzE3KCkpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8xOCgpIHsKKwkJbG9uZ1tdIGRhdGEgPSB7IDEzMTA3MkwsIDBMfTsKKwkJcmV0dXJuIGRhdGE7CisJfQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8xOCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMTgoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzE5KCkgeworCQlsb25nW10gZGF0YSA9IHsgMTY3NzcyMTZMLCAwTH07CisJCXJldHVybiBkYXRhOworCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTkgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzE5KCkpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8yMCgpIHsKKwkJbG9uZ1tdIGRhdGEgPSB7IDE2Nzg1NDA4TCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzIwID0gbmV3IEJpdFNldChta190b2tlblNldF8yMCgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjEoKSB7CisJCWxvbmdbXSBkYXRhID0geyA0Nzg1MDA2MTUzMTcxOTY4TCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzIxID0gbmV3IEJpdFNldChta190b2tlblNldF8yMSgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjIoKSB7CisJCWxvbmdbXSBkYXRhID0geyA0NTAzODA2MDU0MjM2MjI0TCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzIyID0gbmV3IEJpdFNldChta190b2tlblNldF8yMigpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjMoKSB7CisJCWxvbmdbXSBkYXRhID0geyAyODgyMzA0MTA1MTE0NTAyMDhMLCAwTH07CisJCXJldHVybiBkYXRhOworCX0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMjMgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzIzKCkpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8yNCgpIHsKKwkJbG9uZ1tdIGRhdGEgPSB7IDMyTCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzI0ID0gbmV3IEJpdFNldChta190b2tlblNldF8yNCgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjUoKSB7CisJCWxvbmdbXSBkYXRhID0geyAxMDczNzQxODI0TCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzI1ID0gbmV3IEJpdFNldChta190b2tlblNldF8yNSgpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjYoKSB7CisJCWxvbmdbXSBkYXRhID0geyAzMjIxMjI1NDcyTCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzI2ID0gbmV3IEJpdFNldChta190b2tlblNldF8yNigpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjcoKSB7CisJCWxvbmdbXSBkYXRhID0geyA0Nzg1MDA2MTUzMDM5OTM2TCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzI3ID0gbmV3IEJpdFNldChta190b2tlblNldF8yNygpKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjgoKSB7CisJCWxvbmdbXSBkYXRhID0geyAzNjAyODc5NzAxODk2Mzk2OEwsIDBMfTsKKwkJcmV0dXJuIGRhdGE7CisJfQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8yOCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMjgoKSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzI5KCkgeworCQlsb25nW10gZGF0YSA9IHsgMTMyMTYwTCwgMEx9OworCQlyZXR1cm4gZGF0YTsKKwl9CisJcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzI5ID0gbmV3IEJpdFNldChta190b2tlblNldF8yOSgpKTsKKwkKKwl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9BTlRMUnYycGFyc2VyL0VtZmF0aWNQYXJzZXIuc21hcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0FOVExSdjJwYXJzZXIvRW1mYXRpY1BhcnNlci5zbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZWRlNzcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9BTlRMUnYycGFyc2VyL0VtZmF0aWNQYXJzZXIuc21hcApAQCAtMCwwICsxLDE1NzEgQEAKK1NNQVAKK0VtZmF0aWNQYXJzZXIuamF2YQorRworKlMgRworKkYKKysgMCBFbWZhdGljLmcKK0VtZmF0aWMuZworKkwKKzM6MworMzo0CiszOjUKKzM6NgorMTc6MjUKKzE4OjI2CisxOToyNworMjE6MjkKKzIyOjMwCisyMzozMQorMjQ6MzIKKzI3OjM1CisyODozNgorMjk6MzcKKzMwOjM4CiszMjo0MAorMzM6NDEKKzM0OjQyCiszNTo0MworMzY6NDQKKzM4OjQ2CiszOTo0NworNDA6NDgKKzQxOjQ5Cis0Mjo1MAorNDQ6NTIKKzQ1OjUzCis0Njo1NAorNDc6NTUKKzQ4OjU2Cis1Mjo4MgorNTI6ODMKKzUyOjg2Cis1Mjo5MworNTI6OTQKKzUyOjk1Cis1Mjo5NgorNTI6OTcKKzUyOjk4Cis1Mjo5OQorNTQ6ODcKKzU1Ojg4Cis1NTo4OQorNTU6OTAKKzU1OjkxCis1Njo5MgorNTk6MTAxCis1OToxMDIKKzU5OjEwNworNTk6MTE2Cis1OToxMTcKKzU5OjExOAorNTk6MTE5Cis1OToxMjAKKzU5OjEyMQorNTk6MTIyCis2MToxMDgKKzYyOjEwNAorNjI6MTA1Cis2MjoxMDkKKzYyOjExMAorNjI6MTExCis2MjoxMTIKKzYyOjExMworNjI6MTE0Cis2MzoxMTUKKzY2OjIwNQorNjY6MjA2Cis2NjoyMTEKKzY2OjIzMQorNjY6MjMyCis2NjoyMzMKKzY2OjIzNAorNjY6MjM1Cis2NjoyMzYKKzY2OjIzNworNjg6MjEyCis2OToyMDgKKzY5OjIxMworNjk6MjE0Cis2OToyMTUKKzcwOjIwOQorNzA6MjE2Cis3MDoyMTcKKzcwOjIxOAorNzA6MjE5Cis3MDoyMjAKKzcwOjIyMQorNzA6MjIyCis3MDoyMjMKKzcwOjIyNAorNzA6MjI1Cis3MDoyMjYKKzcwOjIyNworNzA6MjI5Cis3MDoyMzAKKzczOjIzOQorNzM6MjQwCis3MzoyNDIKKzczOjI0NAorNzM6MjY0Cis3MzoyNjUKKzczOjI2NgorNzM6MjY3Cis3MzoyNjgKKzczOjI2OQorNzM6MjcwCis3NToyNDYKKzc1OjI0NworNzU6MjQ4Cis3NToyNDkKKzc1OjI1NworNzU6MjU4Cis3NToyNTkKKzc1OjI2MAorNzU6MjYxCis3NjoyNTIKKzc2OjI1MworNzY6MjU0Cis3ODoyNjMKKzgxOjI3MgorODE6MjczCis4MToyNzYKKzgxOjI5NQorODE6Mjk2Cis4MToyOTcKKzgxOjI5OAorODE6Mjk5Cis4MTozMDAKKzgxOjMwMQorODM6Mjc4Cis4MzoyNzkKKzgzOjI4MAorODM6MjgxCis4MzoyODkKKzgzOjI5MAorODM6MjkxCis4MzoyOTIKKzgzOjI5MworODQ6Mjg0Cis4NDoyODUKKzg0OjI4NgorODg6MzAzCis4ODozMDQKKzg4OjMwOAorODg6MzEyCis4ODozMTMKKzg4OjMxNAorODg6MzE1Cis4ODozMTYKKzg4OjMxNworODg6MzE4Cis5MDozMDYKKzkwOjMwOQorOTA6MzEwCis5MTozMTEKKzk0OjMyMAorOTQ6MzIxCis5NDozMjQKKzk0OjMyOAorOTQ6MzI5Cis5NDozMzAKKzk0OjMzMQorOTQ6MzMyCis5NDozMzMKKzk0OjMzNAorOTY6MzI1Cis5NzozMjYKKzk4OjMyNworMTAxOjE3OAorMTAxOjE3OQorMTAxOjE4MgorMTAxOjE5NworMTAxOjE5OAorMTAxOjE5OQorMTAxOjIwMAorMTAxOjIwMQorMTAxOjIwMgorMTAxOjIwMworMTAzOjE4MworMTA0OjE4NAorMTA0OjE4NQorMTA0OjE4NgorMTA0OjE4NworMTA0OjE4OAorMTA0OjE4OQorMTA0OjE5MAorMTA0OjE5MQorMTA0OjE5MgorMTA0OjE5MworMTA0OjE5NQorMTA0OjE5NgorMTA3OjMzNgorMTA3OjMzNworMTA3OjM0MworMTA3OjM1NAorMTA3OjM1NQorMTA3OjM1NgorMTA3OjM1NworMTA3OjM1OAorMTA3OjM1OQorMTA3OjM2MAorMTA5OjM0NAorMTEwOjMzOQorMTEwOjM0MAorMTEwOjM0MQorMTEwOjM0NQorMTEwOjM0NgorMTEwOjM0NworMTEwOjM0OAorMTEwOjM0OQorMTEwOjM1MAorMTEwOjM1MQorMTEwOjM1MgorMTExOjM1MworMTE0OjM2MgorMTE0OjM2MworMTE0OjM2NworMTE0OjM4NgorMTE0OjM4NworMTE0OjM4OAorMTE0OjM4OQorMTE0OjM5MAorMTE0OjM5MQorMTE0OjM5MgorMTE2OjM2OAorMTE3OjM2OQorMTE3OjM3MAorMTE4OjM2NQorMTE4OjM3MQorMTE4OjM3MgorMTE4OjM3MworMTE4OjM3NAorMTE4OjM3NQorMTE4OjM3NgorMTE4OjM3NworMTE4OjM3OAorMTE4OjM3OQorMTE4OjM4MAorMTE4OjM4MQorMTE4OjM4MgorMTE4OjM4NAorMTE4OjM4NQorMTIxOjM5NAorMTIxOjM5NQorMTIxOjM5OQorMTIxOjQwNgorMTIxOjQwNworMTIxOjQwOAorMTIxOjQwOQorMTIxOjQxMAorMTIxOjQxMQorMTIxOjQxMgorMTIzOjQwMAorMTI0OjM5NworMTI0OjQwMQorMTI0OjQwMgorMTI0OjQwMworMTI0OjQwNAorMTI1OjQwNQorMTI4OjEyNAorMTI4OjEyNQorMTI4OjEyOAorMTI4OjE0MworMTI4OjE0NAorMTI4OjE0NQorMTI4OjE0NgorMTI4OjE0NworMTI4OjE0OAorMTI4OjE0OQorMTMwOjEyOQorMTMxOjEzMAorMTMxOjEzMQorMTMxOjEzMgorMTMxOjEzMworMTMxOjEzNAorMTMxOjEzNQorMTMxOjEzNgorMTMxOjEzNworMTMxOjEzOAorMTMxOjEzOQorMTMxOjE0MQorMTMxOjE0MgorMTM0OjQxNAorMTM0OjQxNQorMTM0OjQyMgorMTM0OjQ0NAorMTM0OjQ0NQorMTM0OjQ0NgorMTM0OjQ0NworMTM0OjQ0OAorMTM0OjQ0OQorMTM0OjQ1MAorMTM2OjQyMworMTM3OjQxNworMTM3OjQxOAorMTM3OjQxOQorMTM3OjQyMAorMTM3OjQyNAorMTM3OjQyNQorMTM3OjQyNworMTM3OjQyOAorMTM3OjQyOQorMTM3OjQzMAorMTM3OjQzMQorMTM3OjQzMgorMTM3OjQzNAorMTM3OjQzNQorMTM3OjQzNgorMTM3OjQzNworMTM3OjQ0MAorMTM3OjQ0MQorMTM3OjQ0MgorMTM4OjQ0MworMTQxOjE1MQorMTQxOjE1MgorMTQxOjE1NQorMTQxOjE3MAorMTQxOjE3MQorMTQxOjE3MgorMTQxOjE3MworMTQxOjE3NAorMTQxOjE3NQorMTQxOjE3NgorMTQzOjE1NgorMTQ0OjE1NworMTQ0OjE1OAorMTQ0OjE1OQorMTQ0OjE2MAorMTQ0OjE2MQorMTQ0OjE2MgorMTQ0OjE2MworMTQ0OjE2NAorMTQ0OjE2NQorMTQ0OjE2NgorMTQ0OjE2OAorMTQ0OjE2OQorMTQ3OjQ1MgorMTQ3OjQ1MworMTQ3OjQ1NgorMTQ3OjQ5NQorMTQ3OjQ5NgorMTQ3OjQ5NworMTQ3OjQ5OAorMTQ3OjQ5OQorMTQ3OjUwMAorMTQ3OjUwMQorMTQ5OjQ1NworMTUwOjQ1OAorMTUxOjQ2MAorMTUxOjQ2MQorMTUxOjQ2MgorMTUxOjQ2MworMTUxOjQ4OQorMTUxOjQ5MAorMTUxOjQ5MQorMTUxOjQ5MgorMTUxOjQ5MworMTUyOjQ2NgorMTUyOjQ2NworMTUyOjQ2OAorMTUyOjQ2OQorMTUyOjQ3MAorMTUzOjQ3MworMTUzOjQ3NAorMTUzOjQ3NQorMTUzOjQ3NgorMTU0OjQ3OQorMTU0OjQ4MAorMTU0OjQ4MQorMTU1OjQ4NAorMTU1OjQ4NQorMTU1OjQ4NgorMTU5OjUwMworMTU5OjUwNAorMTU5OjUwNQorMTU5OjUwNgorMTU5OjUxMworMTU5OjUyNQorMTU5OjUyNgorMTU5OjUyNworMTU5OjUyOAorMTU5OjUyOQorMTU5OjUzMAorMTU5OjUzMQorMTYxOjUxNAorMTYyOjUwOAorMTYyOjUwOQorMTYyOjUxMAorMTYyOjUxMQorMTYyOjUxNQorMTYyOjUxNgorMTYyOjUxNworMTYyOjUxOAorMTYyOjUxOQorMTYyOjUyMAorMTYyOjUyMQorMTYyOjUyMgorMTYyOjUyMworMTYzOjUyNAorMTY2OjUzMworMTY2OjUzNAorMTY2OjUzNQorMTY2OjUzNgorMTY2OjU0NAorMTY2OjYzMQorMTY2OjYzMgorMTY2OjYzMworMTY2OjYzNAorMTY2OjYzNQorMTY2OjYzNgorMTY2OjYzNworMTY4OjU0NQorMTY5OjUzOAorMTY5OjUzOQorMTY5OjU0MAorMTY5OjU0MQorMTY5OjU0MgorMTY5OjU0NworMTY5OjU0OAorMTY5OjU0OQorMTY5OjU1MAorMTY5OjU1OAorMTY5OjU1OQorMTY5OjU2MAorMTY5OjU2MQorMTY5OjU2MgorMTY5OjU2NAorMTY5OjU2NQorMTY5OjU2NgorMTY5OjU2OAorMTY5OjU2OQorMTY5OjU3MAorMTY5OjU3MQorMTY5OjU4MAorMTY5OjU4MQorMTY5OjU4MgorMTY5OjU4MworMTY5OjU4NAorMTY5OjU4NworMTY5OjU4OAorMTY5OjU4OQorMTY5OjU5MAorMTY5OjU5MQorMTY5OjU5MgorMTY5OjYwMAorMTY5OjYwMQorMTY5OjYwMgorMTY5OjYwMworMTY5OjYwNAorMTY5OjYwNworMTY5OjYwOAorMTY5OjYwOQorMTY5OjYxMAorMTY5OjYxMQorMTY5OjYxMgorMTY5OjYxOQorMTY5OjYyMAorMTY5OjYyMQorMTY5OjYyMgorMTY5OjYyMworMTY5OjYyNQorMTY5OjYyNgorMTY5OjYyNworMTY5OjYyOAorMTY5OjYyOQorMTcwOjYzMAorMTczOjgyMgorMTczOjgyMworMTczOjgyNworMTczOjg0NgorMTczOjg0NworMTczOjg0OAorMTczOjg0OQorMTczOjg1MAorMTczOjg1MQorMTczOjg1MgorMTc1OjgyOAorMTc2OjgyOQorMTc2OjgzMAorMTc3OjgyNQorMTc3OjgzMQorMTc3OjgzMgorMTc3OjgzMworMTc3OjgzNAorMTc3OjgzNQorMTc3OjgzNgorMTc3OjgzNworMTc3OjgzOAorMTc3OjgzOQorMTc3Ojg0MAorMTc3Ojg0MQorMTc3Ojg0MgorMTc3Ojg0NAorMTc3Ojg0NQorMTgwOjc1MAorMTgwOjc1MQorMTgwOjc1NQorMTgwOjc1OQorMTgwOjc2MAorMTgwOjc2MQorMTgwOjc2MgorMTgwOjc2MworMTgwOjc2NAorMTgwOjc2NQorMTgyOjc1MworMTgyOjc1NgorMTgyOjc1NworMTgzOjc1OAorMTg2Ojc2NworMTg2Ojc2OAorMTg2Ojc3MAorMTg2Ojc3MgorMTg2Ojc5MgorMTg2Ojc5MworMTg2Ojc5NAorMTg2Ojc5NQorMTg2Ojc5NgorMTg2Ojc5NworMTg2Ojc5OAorMTg4Ojc3NAorMTg4Ojc3NQorMTg4Ojc3NgorMTg4Ojc3NworMTg4Ojc4NQorMTg4Ojc4NgorMTg4Ojc4NworMTg4Ojc4OAorMTg4Ojc4OQorMTg5Ojc4MAorMTg5Ojc4MQorMTg5Ojc4MgorMTkxOjc5MQorMTk0OjgwMAorMTk0OjgwMQorMTk0OjgwNgorMTk0OjgxNAorMTk0OjgxNQorMTk0OjgxNgorMTk0OjgxNworMTk0OjgxOAorMTk0OjgxOQorMTk0OjgyMAorMTk2OjgwNworMTk3OjgwMworMTk3OjgwNAorMTk3OjgwOAorMTk3OjgwOQorMTk3OjgxMAorMTk3OjgxMQorMTk3OjgxMgorMTk4OjgxMworMjAxOjkyOQorMjAxOjkzMAorMjAxOjkzNAorMjAxOjk1MworMjAxOjk1NAorMjAxOjk1NQorMjAxOjk1NgorMjAxOjk1NworMjAxOjk1OAorMjAxOjk1OQorMjAzOjkzNQorMjA0OjkzNgorMjA0OjkzNworMjA1OjkzMgorMjA1OjkzOAorMjA1OjkzOQorMjA1Ojk0MAorMjA1Ojk0MQorMjA1Ojk0MgorMjA1Ojk0MworMjA1Ojk0NAorMjA1Ojk0NQorMjA1Ojk0NgorMjA1Ojk0NworMjA1Ojk0OAorMjA1Ojk0OQorMjA1Ojk1MQorMjA1Ojk1MgorMjA4Ojk2MQorMjA4Ojk2MgorMjA4Ojk2NgorMjA4Ojk4OQorMjA4Ojk5MAorMjA4Ojk5MQorMjA4Ojk5MgorMjA4Ojk5MworMjA4Ojk5NAorMjA4Ojk5NQorMjEwOjk2NworMjExOjk2NAorMjExOjk2OAorMjExOjk2OQorMjExOjk3MQorMjExOjk3MgorMjExOjk3MworMjExOjk3NAorMjExOjk4MgorMjExOjk4MworMjExOjk4NAorMjExOjk4NQorMjExOjk4NgorMjEyOjk4OAorMjE1Ojk5NworMjE1Ojk5OAorMjE1OjEwMDIKKzIxNToxMDA4CisyMTU6MTAwOQorMjE1OjEwMTAKKzIxNToxMDExCisyMTU6MTAxMgorMjE1OjEwMTMKKzIxNToxMDE0CisyMTc6MTAwMworMjE4OjEwMDAKKzIxODoxMDA0CisyMTg6MTAwNQorMjE4OjEwMDYKKzIxOToxMDA3CisyMjI6MTAxNgorMjIyOjEwMTcKKzIyMjoxMDIxCisyMjI6MTA0MAorMjIyOjEwNDEKKzIyMjoxMDQyCisyMjI6MTA0MworMjIyOjEwNDQKKzIyMjoxMDQ1CisyMjI6MTA0NgorMjI0OjEwMjIKKzIyNToxMDIzCisyMjU6MTAyNAorMjI2OjEwMTkKKzIyNjoxMDI1CisyMjY6MTAyNgorMjI2OjEwMjcKKzIyNjoxMDI4CisyMjY6MTAyOQorMjI2OjEwMzAKKzIyNjoxMDMxCisyMjY6MTAzMgorMjI2OjEwMzMKKzIyNjoxMDM0CisyMjY6MTAzNQorMjI2OjEwMzYKKzIyNjoxMDM4CisyMjY6MTAzOQorMjI5Ojg1NAorMjI5Ojg1NQorMjI5Ojg2MAorMjI5Ojg5NAorMjI5Ojg5NQorMjI5Ojg5NgorMjI5Ojg5NworMjI5Ojg5OAorMjI5Ojg5OQorMjI5OjkwMAorMjMxOjg2MQorMjMyOjg1NworMjMyOjg1OAorMjMyOjg2MgorMjMyOjg2NAorMjMyOjg2NQorMjMyOjg2NgorMjMyOjg2NworMjMyOjg2OAorMjMyOjg2OQorMjMyOjg3MAorMjMyOjg3MQorMjMyOjg4NworMjMyOjg4OAorMjMyOjg4OQorMjMyOjg5MAorMjMyOjg5MQorMjMzOjg5MworMjM2OjEwNDgKKzIzNjoxMDQ5CisyMzY6MTA1MworMjM2OjEwNzIKKzIzNjoxMDczCisyMzY6MTA3NAorMjM2OjEwNzUKKzIzNjoxMDc2CisyMzY6MTA3NworMjM2OjEwNzgKKzIzODoxMDU0CisyMzk6MTA1NQorMjM5OjEwNTYKKzI0MDoxMDUxCisyNDA6MTA1NworMjQwOjEwNTgKKzI0MDoxMDU5CisyNDA6MTA2MAorMjQwOjEwNjEKKzI0MDoxMDYyCisyNDA6MTA2MworMjQwOjEwNjQKKzI0MDoxMDY1CisyNDA6MTA2NgorMjQwOjEwNjcKKzI0MDoxMDY4CisyNDA6MTA3MAorMjQwOjEwNzEKKzI0MzoxMDgwCisyNDM6MTA4MQorMjQzOjEwODQKKzI0MzoxMTAzCisyNDM6MTEwNAorMjQzOjExMDUKKzI0MzoxMTA2CisyNDM6MTEwNworMjQzOjExMDgKKzI0MzoxMTA5CisyNDU6MTA4NgorMjQ1OjEwODcKKzI0NToxMDg4CisyNDU6MTA4OQorMjQ1OjEwOTcKKzI0NToxMDk4CisyNDU6MTA5OQorMjQ1OjExMDAKKzI0NToxMTAxCisyNDY6MTA5MgorMjQ2OjEwOTMKKzI0NjoxMDk0CisyNTA6MTExMQorMjUwOjExMTIKKzI1MDoxMTE2CisyNTA6MTE0MQorMjUwOjExNDIKKzI1MDoxMTQzCisyNTA6MTE0NAorMjUwOjExNDUKKzI1MDoxMTQ2CisyNTA6MTE0NworMjUyOjExMTcKKzI1MzoxMTE0CisyNTM6MTExOAorMjUzOjExMTkKKzI1MzoxMTIxCisyNTM6MTEyMgorMjUzOjExMjMKKzI1MzoxMTI0CisyNTM6MTEyNQorMjUzOjExMjYKKzI1MzoxMTM0CisyNTM6MTEzNQorMjUzOjExMzYKKzI1MzoxMTM3CisyNTM6MTEzOAorMjU0OjExNDAKKzI1NzoxMTQ5CisyNTc6MTE1MAorMjU3OjExNTIKKzI1NzoxMTU0CisyNTc6MTE3NAorMjU3OjExNzUKKzI1NzoxMTc2CisyNTc6MTE3NworMjU3OjExNzgKKzI1NzoxMTc5CisyNTc6MTE4MAorMjU5OjExNTYKKzI1OToxMTU3CisyNTk6MTE1OAorMjU5OjExNTkKKzI1OToxMTY3CisyNTk6MTE2OAorMjU5OjExNjkKKzI1OToxMTcwCisyNTk6MTE3MQorMjYwOjExNjIKKzI2MDoxMTYzCisyNjA6MTE2NAorMjYyOjExNzMKKzI2NTo5MDIKKzI2NTo5MDMKKzI2NTo5MDYKKzI2NTo5MjEKKzI2NTo5MjIKKzI2NTo5MjMKKzI2NTo5MjQKKzI2NTo5MjUKKzI2NTo5MjYKKzI2NTo5MjcKKzI2Nzo5MDcKKzI2ODo5MDgKKzI2ODo5MDkKKzI2ODo5MTAKKzI2ODo5MTEKKzI2ODo5MTIKKzI2ODo5MTMKKzI2ODo5MTQKKzI2ODo5MTUKKzI2ODo5MTYKKzI2ODo5MTcKKzI2ODo5MTkKKzI2ODo5MjAKKzI3MToxMTgyCisyNzE6MTE4MworMjcxOjExODYKKzI3MToxMjE0CisyNzE6MTIxNQorMjcxOjEyMTYKKzI3MToxMjE3CisyNzE6MTIxOAorMjcxOjEyMTkKKzI3MToxMjIwCisyNzM6MTE4NworMjc0OjExODgKKzI3NDoxMTg5CisyNzU6MTE5MQorMjc1OjExOTIKKzI3NToxMTkzCisyNzU6MTE5NAorMjc1OjEyMDgKKzI3NToxMjA5CisyNzU6MTIxMAorMjc1OjEyMTEKKzI3NToxMjEyCisyNzY6MTE5NworMjc2OjExOTgKKzI3NjoxMTk5CisyNzY6MTIwMAorMjc3OjEyMDMKKzI3NzoxMjA0CisyNzc6MTIwNQorMjgxOjEyNDkKKzI4MToxMjUwCisyODE6MTI1MQorMjgxOjEyNTIKKzI4MToxMjU5CisyODE6MTI4OAorMjgxOjEyODkKKzI4MToxMjkwCisyODE6MTI5MQorMjgxOjEyOTIKKzI4MToxMjkzCisyODE6MTI5NAorMjgzOjEyNjAKKzI4NDoxMjU0CisyODQ6MTI1NQorMjg0OjEyNTYKKzI4NDoxMjU3CisyODQ6MTI2MQorMjg0OjEyNjIKKzI4NDoxMjYzCisyODQ6MTI2NAorMjg0OjEyNjUKKzI4NDoxMjY3CisyODQ6MTI2OAorMjg0OjEyNjkKKzI4NDoxMjcwCisyODQ6MTI3MQorMjg0OjEyNzIKKzI4NDoxMjc5CisyODQ6MTI4MAorMjg0OjEyODEKKzI4NDoxMjgyCisyODQ6MTI4MworMjg0OjEyODUKKzI4NDoxMjg2CisyODU6MTI4NworMjg4OjE0NDIKKzI4ODoxNDQzCisyODg6MTQ0NgorMjg4OjE0NzAKKzI4ODoxNDcxCisyODg6MTQ3MgorMjg4OjE0NzMKKzI4ODoxNDc0CisyODg6MTQ3NQorMjg4OjE0NzYKKzI5MDoxNDQ3CisyOTE6MTQ0OAorMjkxOjE0NTAKKzI5MToxNDUxCisyOTE6MTQ1MgorMjkxOjE0NTMKKzI5MToxNDYzCisyOTE6MTQ2NAorMjkxOjE0NjUKKzI5MToxNDY2CisyOTE6MTQ2NworMjkyOjE0NjkKKzI5NToxNTIxCisyOTU6MTUyMgorMjk1OjE1MjcKKzI5NToxNTU0CisyOTU6MTU1NQorMjk1OjE1NTYKKzI5NToxNTU3CisyOTU6MTU1OAorMjk1OjE1NTkKKzI5NToxNTYwCisyOTc6MTUyOAorMjk4OjE1MjQKKzI5ODoxNTI1CisyOTg6MTUyOQorMjk4OjE1MzAKKzI5ODoxNTMyCisyOTg6MTUzMworMjk4OjE1MzQKKzI5ODoxNTM1CisyOTg6MTUzNgorMjk4OjE1MzcKKzI5ODoxNTM4CisyOTg6MTU0NQorMjk4OjE1NDYKKzI5ODoxNTQ3CisyOTg6MTU0OAorMjk4OjE1NDkKKzI5ODoxNTUxCisyOTg6MTU1MgorMjk5OjE1NTMKKzMwMjoxNTYyCiszMDI6MTU2MworMzAyOjE1NjcKKzMwMjoxNTkwCiszMDI6MTU5MQorMzAyOjE1OTIKKzMwMjoxNTkzCiszMDI6MTU5NAorMzAyOjE1OTUKKzMwMjoxNTk2CiszMDQ6MTU2OAorMzA1OjE1NjUKKzMwNToxNTY5CiszMDU6MTU3MQorMzA1OjE1NzIKKzMwNToxNTczCiszMDU6MTU3NAorMzA1OjE1NzUKKzMwNToxNTc2CiszMDU6MTU4MworMzA1OjE1ODQKKzMwNToxNTg1CiszMDU6MTU4NgorMzA1OjE1ODcKKzMwNjoxNTg5CiszMDk6MTU5OAorMzA5OjE1OTkKKzMwOToxNjAxCiszMDk6MTYwMworMzA5OjE2MzMKKzMwOToxNjM0CiszMDk6MTYzNQorMzA5OjE2MzYKKzMwOToxNjM3CiszMDk6MTYzOAorMzA5OjE2MzkKKzMxMToxNjA1CiszMTE6MTYwNgorMzExOjE2MDcKKzMxMToxNjA4CiszMTE6MTYyNgorMzExOjE2MjcKKzMxMToxNjI4CiszMTE6MTYyOQorMzExOjE2MzAKKzMxMjoxNjExCiszMTI6MTYxMgorMzEyOjE2MTMKKzMxMzoxNjE2CiszMTM6MTYxNworMzEzOjE2MTgKKzMxNDoxNjIxCiszMTQ6MTYyMgorMzE0OjE2MjMKKzMxNjoxNjMyCiszMTk6MTI5NgorMzE5OjEyOTcKKzMxOToxMjk4CiszMTk6MTI5OQorMzE5OjEzMDYKKzMxOToxMzM1CiszMTk6MTMzNgorMzE5OjEzMzcKKzMxOToxMzM4CiszMTk6MTMzOQorMzE5OjEzNDAKKzMxOToxMzQxCiszMjE6MTMwNworMzIyOjEzMDEKKzMyMjoxMzAyCiszMjI6MTMwMworMzIyOjEzMDQKKzMyMjoxMzA4CiszMjI6MTMwOQorMzIyOjEzMTEKKzMyMjoxMzEyCiszMjI6MTMxMworMzIyOjEzMTQKKzMyMjoxMzE1CiszMjI6MTMxNgorMzIyOjEzMTcKKzMyMjoxMzI0CiszMjI6MTMyNQorMzIyOjEzMjYKKzMyMjoxMzI3CiszMjI6MTMyOAorMzIyOjEzMzAKKzMyMjoxMzMxCiszMjI6MTMzMgorMzIyOjEzMzMKKzMyMzoxMzM0CiszMjY6MTY0MQorMzI2OjE2NDIKKzMyNjoxNjQ0CiszMjY6MTY0NgorMzI2OjE2NjYKKzMyNjoxNjY3CiszMjY6MTY2OAorMzI2OjE2NjkKKzMyNjoxNjcwCiszMjY6MTY3MQorMzI2OjE2NzIKKzMyODoxNjQ4CiszMjg6MTY0OQorMzI4OjE2NTAKKzMyODoxNjUxCiszMjg6MTY1OQorMzI4OjE2NjAKKzMyODoxNjYxCiszMjg6MTY2MgorMzI4OjE2NjMKKzMyOToxNjU0CiszMjk6MTY1NQorMzI5OjE2NTYKKzMzMToxNjY1CiszMzQ6MTIyMgorMzM0OjEyMjMKKzMzNDoxMjI2CiszMzQ6MTI0MQorMzM0OjEyNDIKKzMzNDoxMjQzCiszMzQ6MTI0NAorMzM0OjEyNDUKKzMzNDoxMjQ2CiszMzQ6MTI0NworMzM2OjEyMjcKKzMzNzoxMjI4CiszMzc6MTIyOQorMzM3OjEyMzAKKzMzNzoxMjMxCiszMzc6MTIzMgorMzM3OjEyMzMKKzMzNzoxMjM0CiszMzc6MTIzNQorMzM3OjEyMzYKKzMzNzoxMjM3CiszMzc6MTIzOQorMzM3OjEyNDAKKzM0MDoxNjc0CiszNDA6MTY3NQorMzQwOjE2NzkKKzM0MDoxNzA5CiszNDA6MTcxMAorMzQwOjE3MTEKKzM0MDoxNzEyCiszNDA6MTcxMworMzQwOjE3MTQKKzM0MDoxNzE1CiszNDI6MTY4MAorMzQzOjE2NzcKKzM0MzoxNjgyCiszNDM6MTY4MworMzQzOjE2ODQKKzM0MzoxNjg1CiszNDM6MTY4NgorMzQzOjE3MDEKKzM0MzoxNzAyCiszNDM6MTcwMworMzQzOjE3MDQKKzM0MzoxNzA1CiszNDM6MTcwNworMzQ0OjE3MDgKKzM0NzoxNzE3CiszNDc6MTcxOAorMzQ3OjE3MjAKKzM0NzoxNzIyCiszNDc6MTc3NworMzQ3OjE3NzgKKzM0NzoxNzc5CiszNDc6MTc4MAorMzQ3OjE3ODEKKzM0NzoxNzgyCiszNDc6MTc4MworMzQ5OjE3MjQKKzM0OToxNzI1CiszNDk6MTcyNgorMzQ5OjE3MjcKKzM0OToxNzcwCiszNDk6MTc3MQorMzQ5OjE3NzIKKzM0OToxNzczCiszNDk6MTc3NAorMzUwOjE3MzAKKzM1MDoxNzMxCiszNTA6MTczMgorMzUxOjE3MzUKKzM1MToxNzM2CiszNTE6MTczNworMzUyOjE3NDAKKzM1MjoxNzQxCiszNTI6MTc0MgorMzUzOjE3NDUKKzM1MzoxNzQ2CiszNTM6MTc0NworMzU0OjE3NTAKKzM1NDoxNzUxCiszNTQ6MTc1MgorMzU1OjE3NTUKKzM1NToxNzU2CiszNTU6MTc1NworMzU2OjE3NjAKKzM1NjoxNzYxCiszNTY6MTc2MgorMzU3OjE3NjUKKzM1NzoxNzY2CiszNTc6MTc2NworMzU5OjE3NzYKKzM2MjoxNDc4CiszNjI6MTQ3OQorMzYyOjE0ODIKKzM2MjoxNTEzCiszNjI6MTUxNAorMzYyOjE1MTUKKzM2MjoxNTE2CiszNjI6MTUxNworMzYyOjE1MTgKKzM2MjoxNTE5CiszNjQ6MTQ4NAorMzY0OjE0ODUKKzM2NDoxNDg2CiszNjQ6MTQ4NworMzY0OjE0ODgKKzM2NDoxNTA3CiszNjQ6MTUwOAorMzY0OjE1MDkKKzM2NDoxNTEwCiszNjQ6MTUxMQorMzY1OjE0OTEKKzM2NToxNDkyCiszNjU6MTQ5MworMzY1OjE0OTQKKzM2NjoxNDk3CiszNjY6MTQ5OAorMzY2OjE0OTkKKzM2NzoxNTAyCiszNjc6MTUwMworMzY3OjE1MDQKKzM3MToxNzg1CiszNzE6MTc4NgorMzcxOjE3ODkKKzM3MToxNzkzCiszNzE6MTc5NAorMzcxOjE3OTUKKzM3MToxNzk2CiszNzE6MTc5NworMzcxOjE3OTgKKzM3MToxNzk5CiszNzM6MTc5MAorMzc0OjE3OTEKKzM3NToxNzkyCiszNzg6MTg3MQorMzc4OjE4NzIKKzM3ODoxODc0CiszNzg6MTg3NgorMzc4OjE4OTYKKzM3ODoxODk3CiszNzg6MTg5OAorMzc4OjE4OTkKKzM3ODoxOTAwCiszNzg6MTkwMQorMzc4OjE5MDIKKzM4MDoxODc4CiszODA6MTg3OQorMzgwOjE4ODAKKzM4MDoxODgxCiszODA6MTg4OQorMzgwOjE4OTAKKzM4MDoxODkxCiszODA6MTg5MgorMzgwOjE4OTMKKzM4MToxODg0CiszODE6MTg4NQorMzgxOjE4ODYKKzM4MzoxODk1CiszODY6MTgwMQorMzg2OjE4MDIKKzM4NjoxODA3CiszODY6MTgyOQorMzg2OjE4MzAKKzM4NjoxODMxCiszODY6MTgzMgorMzg2OjE4MzMKKzM4NjoxODM0CiszODY6MTgzNQorMzg4OjE4MDQKKzM4ODoxODA1CiszODg6MTgwOQorMzg4OjE4MTAKKzM4ODoxODExCiszODg6MTgxMgorMzg4OjE4MTMKKzM4ODoxODIwCiszODg6MTgyMQorMzg4OjE4MjIKKzM4ODoxODIzCiszODg6MTgyNAorMzg4OjE4MjYKKzM4ODoxODI3CiszODk6MTgyOAorMzkyOjE4MzcKKzM5MjoxODM4CiszOTI6MTg0MgorMzkyOjE4NDYKKzM5MjoxODQ3CiszOTI6MTg0OAorMzkyOjE4NDkKKzM5MjoxODUwCiszOTI6MTg1MQorMzkyOjE4NTIKKzM5NDoxODQwCiszOTQ6MTg0MworMzk0OjE4NDQKKzM5NToxODQ1CiszOTg6MTg1NAorMzk4OjE4NTUKKzM5ODoxODU5CiszOTg6MTg2MworMzk4OjE4NjQKKzM5ODoxODY1CiszOTg6MTg2NgorMzk4OjE4NjcKKzM5ODoxODY4CiszOTg6MTg2OQorNDAwOjE4NTcKKzQwMDoxODYwCis0MDA6MTg2MQorNDAxOjE4NjIKKzQwNDoxMzQzCis0MDQ6MTM0NAorNDA0OjEzNDUKKzQwNDoxMzQ2Cis0MDQ6MTM1NQorNDA0OjE0MzQKKzQwNDoxNDM1Cis0MDQ6MTQzNgorNDA0OjE0MzcKKzQwNDoxNDM4Cis0MDQ6MTQzOQorNDA0OjE0NDAKKzQwNjoxMzU2Cis0MDc6MTM0OAorNDA3OjEzNDkKKzQwNzoxMzUwCis0MDc6MTM1MQorNDA3OjEzNTIKKzQwNzoxMzUzCis0MDc6MTM1NworNDA3OjEzNTgKKzQwNzoxMzYwCis0MDc6MTM2MQorNDA3OjEzNjIKKzQwNzoxMzYzCis0MDc6MTM3MQorNDA3OjEzNzIKKzQwNzoxMzczCis0MDc6MTM3NAorNDA3OjEzNzUKKzQwNzoxMzc3Cis0MDc6MTM3OAorNDA3OjEzNzkKKzQwNzoxMzgwCis0MDc6MTM4MQorNDA3OjEzODMKKzQwNzoxMzg0Cis0MDc6MTM4NQorNDA3OjEzODYKKzQwNzoxMzg3Cis0MDc6MTM4OAorNDA3OjEzODkKKzQwNzoxMzkwCis0MDc6MTM5MQorNDA3OjEzOTIKKzQwNzoxMzkzCis0MDc6MTM5NAorNDA3OjEzOTUKKzQwNzoxMzk2Cis0MDc6MTM5NworNDA3OjE0MDQKKzQwNzoxNDA1Cis0MDc6MTQwNgorNDA3OjE0MDcKKzQwNzoxNDA4Cis0MDc6MTQxMAorNDA3OjE0MTEKKzQwNzoxNDEzCis0MDc6MTQxNAorNDA3OjE0MTUKKzQwNzoxNDE2Cis0MDc6MTQxNworNDA3OjE0MTgKKzQwNzoxNDI1Cis0MDc6MTQyNgorNDA3OjE0MjcKKzQwNzoxNDI4Cis0MDc6MTQyOQorNDA3OjE0MzEKKzQwNzoxNDMyCis0MDg6MTQzMworNDExOjE5MDQKKzQxMToxOTA1Cis0MTE6MTkwOAorNDExOjE5MjcKKzQxMToxOTI4Cis0MTE6MTkyOQorNDExOjE5MzAKKzQxMToxOTMxCis0MTE6MTkzMgorNDExOjE5MzMKKzQxMzoxOTEwCis0MTM6MTkxMQorNDEzOjE5MTIKKzQxMzoxOTEzCis0MTM6MTkyMQorNDEzOjE5MjIKKzQxMzoxOTIzCis0MTM6MTkyNAorNDEzOjE5MjUKKzQxNDoxOTE2Cis0MTQ6MTkxNworNDE0OjE5MTgKKzQxODoxOTY3Cis0MTg6MTk2OAorNDE4OjE5NzIKKzQxODoxOTc2Cis0MTg6MTk3NworNDE4OjE5NzgKKzQxODoxOTc5Cis0MTg6MTk4MAorNDE4OjE5ODEKKzQxODoxOTgyCis0MjA6MTk3MAorNDIwOjE5NzMKKzQyMDoxOTc0Cis0MjE6MTk3NQorNDI0OjE5MzUKKzQyNDoxOTM2Cis0MjQ6MTk0MAorNDI0OjE5NTkKKzQyNDoxOTYwCis0MjQ6MTk2MQorNDI0OjE5NjIKKzQyNDoxOTYzCis0MjQ6MTk2NAorNDI0OjE5NjUKKzQyNjoxOTQxCis0Mjc6MTk0MgorNDI3OjE5NDMKKzQyODoxOTM4Cis0Mjg6MTk0NAorNDI4OjE5NDUKKzQyODoxOTQ2Cis0Mjg6MTk0NworNDI4OjE5NDgKKzQyODoxOTQ5Cis0Mjg6MTk1MAorNDI4OjE5NTEKKzQyODoxOTUyCis0Mjg6MTk1MworNDI4OjE5NTQKKzQyODoxOTU1Cis0Mjg6MTk1NworNDI4OjE5NTgKKzQzMToxOTg0Cis0MzE6MTk4NQorNDMxOjE5ODkKKzQzMToxOTk4Cis0MzE6MTk5OQorNDMxOjIwMDAKKzQzMToyMDAxCis0MzE6MjAwMgorNDMxOjIwMDMKKzQzMToyMDA0Cis0MzM6MTk5MAorNDM0OjE5ODcKKzQzNDoxOTkxCis0MzQ6MTk5MgorNDM0OjE5OTMKKzQzNDoxOTk0Cis0MzQ6MTk5NQorNDM0OjE5OTYKKzQzNToxOTk3Cis0Mzg6NjM5Cis0Mzg6NjQwCis0Mzg6NjQxCis0Mzg6NjQyCis0Mzg6NjQ5Cis0Mzg6Njc4Cis0Mzg6Njc5Cis0Mzg6NjgwCis0Mzg6NjgxCis0Mzg6NjgyCis0Mzg6NjgzCis0Mzg6Njg0Cis0NDA6NjUwCis0NDE6NjQ0Cis0NDE6NjQ1Cis0NDE6NjQ2Cis0NDE6NjQ3Cis0NDE6NjUyCis0NDE6NjUzCis0NDE6NjU0Cis0NDE6NjU1Cis0NDE6NjYyCis0NDE6NjYzCis0NDE6NjY0Cis0NDE6NjY1Cis0NDE6NjY2Cis0NDE6NjY4Cis0NDE6NjY5Cis0NDE6NjcwCis0NDE6NjcxCis0NDE6NjcyCis0NDE6NjczCis0NDE6Njc0Cis0NDE6Njc1Cis0NDE6Njc2Cis0NDI6Njc3Cis0NDU6MjAwNgorNDQ1OjIwMDcKKzQ0NToyMDExCis0NDU6MjAxNQorNDQ1OjIwMTYKKzQ0NToyMDE3Cis0NDU6MjAxOAorNDQ1OjIwMTkKKzQ0NToyMDIwCis0NDU6MjAyMQorNDQ3OjIwMDkKKzQ0NzoyMDEyCis0NDc6MjAxMworNDQ4OjIwMTQKKzQ1MTo2ODYKKzQ1MTo2ODcKKzQ1MTo2ODgKKzQ1MTo2ODkKKzQ1MTo2OTYKKzQ1MTo3MDgKKzQ1MTo3MDkKKzQ1MTo3MTAKKzQ1MTo3MTEKKzQ1MTo3MTIKKzQ1MTo3MTMKKzQ1MTo3MTQKKzQ1Mzo2OTcKKzQ1NDo2OTEKKzQ1NDo2OTIKKzQ1NDo2OTMKKzQ1NDo2OTQKKzQ1NDo2OTgKKzQ1NDo2OTkKKzQ1NDo3MDAKKzQ1NDo3MDEKKzQ1NDo3MDIKKzQ1NDo3MDMKKzQ1NDo3MDQKKzQ1NDo3MDUKKzQ1NDo3MDYKKzQ1NTo3MDcKKzQ1ODoyMDIzCis0NTg6MjAyNAorNDU4OjIwMjcKKzQ1ODoyMDQyCis0NTg6MjA0MworNDU4OjIwNDQKKzQ1ODoyMDQ1Cis0NTg6MjA0NgorNDU4OjIwNDcKKzQ1ODoyMDQ4Cis0NjA6MjAyOAorNDYxOjIwMjkKKzQ2MToyMDMwCis0NjE6MjAzMQorNDYxOjIwMzIKKzQ2MToyMDMzCis0NjE6MjAzNAorNDYxOjIwMzUKKzQ2MToyMDM2Cis0NjE6MjAzNworNDYxOjIwMzgKKzQ2MToyMDQwCis0NjE6MjA0MQorNDY0OjIwNTAKKzQ2NDoyMDUxCis0NjQ6MjA1OAorNDY0OjIwODgKKzQ2NDoyMDg5Cis0NjQ6MjA5MAorNDY0OjIwOTEKKzQ2NDoyMDkyCis0NjQ6MjA5MworNDY0OjIwOTQKKzQ2NjoyMDU5Cis0Njc6MjA1MworNDY3OjIwNTQKKzQ2NzoyMDU1Cis0Njc6MjA1NgorNDY3OjIwNjAKKzQ2NzoyMDYxCis0Njc6MjA2MgorNDY3OjIwNjQKKzQ2NzoyMDY1Cis0Njc6MjA2NgorNDY3OjIwNjcKKzQ2NzoyMDY4Cis0Njc6MjA2OQorNDY3OjIwNzAKKzQ2NzoyMDc4Cis0Njc6MjA3OQorNDY3OjIwODAKKzQ2NzoyMDgxCis0Njc6MjA4MgorNDY3OjIwODQKKzQ2NzoyMDg1Cis0Njc6MjA4NgorNDY4OjIwODcKKzQ3MTo3MTYKKzQ3MTo3MTcKKzQ3MTo3MTgKKzQ3MTo3MTkKKzQ3MTo3MjcKKzQ3MTo3NDIKKzQ3MTo3NDMKKzQ3MTo3NDQKKzQ3MTo3NDUKKzQ3MTo3NDYKKzQ3MTo3NDcKKzQ3MTo3NDgKKzQ3Mzo3MjgKKzQ3NDo3MjEKKzQ3NDo3MjIKKzQ3NDo3MjMKKzQ3NDo3MjQKKzQ3NDo3MjUKKzQ3NDo3MjkKKzQ3NDo3MzAKKzQ3NDo3MzEKKzQ3NDo3MzIKKzQ3NDo3MzMKKzQ3NDo3MzQKKzQ3NDo3MzUKKzQ3NDo3MzYKKzQ3NDo3MzcKKzQ3NDo3MzgKKzQ3NDo3MzkKKzQ3NDo3NDAKKzQ3NTo3NDEKKypFCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9BTlRMUnYycGFyc2VyL0VtZmF0aWNQYXJzZXJEcml2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0FOVExSdjJwYXJzZXIvRW1mYXRpY1BhcnNlckRyaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjkxODMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9BTlRMUnYycGFyc2VyL0VtZmF0aWNQYXJzZXJEcml2ZXIuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLnBhcnNlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkRpYWdub3N0aWNpYW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmF0b3IuZWNvcmUuQnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lY29yZS5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmF0b3IuZWNvcmUuRW1mYXRpY1NlbWFudGljV2FybmluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Db21wVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5wYXJzZXIuSVBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5wYXJzZXIuUGFyc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLnBhcnNlci5QYXJzZUVycm9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLnBhcnNlci5QYXJzZU1lc3NhZ2U7CisKK2ltcG9ydCBhbnRsci5NaXNtYXRjaGVkQ2hhckV4Y2VwdGlvbjsKK2ltcG9ydCBhbnRsci5NaXNtYXRjaGVkVG9rZW5FeGNlcHRpb247CitpbXBvcnQgYW50bHIuTm9WaWFibGVBbHRFeGNlcHRpb247CitpbXBvcnQgYW50bHIuTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uOworaW1wb3J0IGFudGxyLlJlY29nbml0aW9uRXhjZXB0aW9uOworaW1wb3J0IGFudGxyLlRva2VuU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGFudGxyLlRva2VuU3RyZWFtUmVjb2duaXRpb25FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBFbWZhdGljUGFyc2VyRHJpdmVyIGltcGxlbWVudHMgSVBhcnNlciB7CisKKwlwdWJsaWMgUGFyc2VDb250ZXh0IHBhcnNlKFJlYWRlciBpbnB1dCkgeworCQkKKwkJRW1mYXRpY0xleGVyIGxleGVyID0gbmV3IEVtZmF0aWNMZXhlcihpbnB1dCk7CisJCWxleGVyLnNldENvbHVtbigwKTsKKwkJbGV4ZXIuc2V0VGFiU2l6ZSgxKTsKKworCQlFbWZhdGljUGFyc2VyIHBhcnNlciA9IG5ldyBFbWZhdGljUGFyc2VyKGxleGVyKTsKKwkJUGFyc2VDb250ZXh0IHBhcnNlQ29udGV4dCA9IG5ldyBQYXJzZUNvbnRleHQoKTsKKwkJcGFyc2VyLnNldFBhcnNlQ29udGV4dChwYXJzZUNvbnRleHQpOworCisJCUNvbXBVbml0IGNvbXBVbml0ID0gcGFyc2VDb21wVW5pdChwYXJzZXIsIHBhcnNlQ29udGV4dCk7CisJCWlmIChjb21wVW5pdCAhPSBudWxsKSB7CisJCQlFUGFja2FnZSByb290UGFja2FnZSA9IGFkZEVycm9yc0Zyb21BU1QocGFyc2VDb250ZXh0KTsKKwkJCS8vIGZvciBjb25zdW1wdGlvbiBieSBjaGFuZ2UgbGlzdGVuZXJzIChub3RpZmllZCBieSB0aGUgZWRpdG9yKQorCQkJY29tcFVuaXQuc2V0QVNUKHJvb3RQYWNrYWdlKTsKKwkJfQorCisJCWlmIChwYXJzZUNvbnRleHQuZ2V0TWVzc2FnZUNvdW50KCkgPT0gMCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJQYXJzZSBPSyEiKTsKKwkJfSBlbHNlIHsKKwkJCVBhcnNlTWVzc2FnZVtdIG1zZ3MgPSBwYXJzZUNvbnRleHQuZ2V0TWVzc2FnZXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworCQkJCS8vIFN5c3RlbS5lcnIucHJpbnRsbihtc2dzW2ldLmdldE1lc3NhZ2UoKSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcGFyc2VDb250ZXh0OworCX0KKworCXByaXZhdGUgRVBhY2thZ2UgYWRkRXJyb3JzRnJvbUFTVChQYXJzZUNvbnRleHQgcGFyc2VDb250ZXh0KSB7CisJCUVQYWNrYWdlIHJvb3RQYWNrYWdlID0gbnVsbDsKKwkJLy8gd2FybmlnbnMgYW5kIGVycm9ycyBjb21wdXRlZCBub3QgZnJvbSB0aGUgQ1NUIGJ1dCBmcm9tIHRoZSBBU1QKKwkJQnVpbGRlciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTsKKwkJTnVsbFByb2dyZXNzTW9uaXRvciBucG0gPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKKwkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKCJkdW1teSIpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7CisJCXRyeSB7CisJCQlidWlsZGVyLmJ1aWxkKHBhcnNlQ29udGV4dCwgcmVzb3VyY2UsIG5wbSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJaWYgKCFwYXJzZUNvbnRleHQuaGFzRXJyb3JzKCkpIHsKKwkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yKGJ1aWxkZXIpOworCQkJY29ubmVjdG9yLmNvbm5lY3QocGFyc2VDb250ZXh0LCByZXNvdXJjZSwgbnBtKTsKKwkJCXJvb3RQYWNrYWdlID0gKEVQYWNrYWdlKSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKKwkJCWlmIChyb290UGFja2FnZSAhPSBudWxsKSB7CisJCQkJLy8gaW52b2tlIEVjb3JlVmFsaWRhdG9yCisJCQkJRGlhZ25vc3RpY2lhbiBkaWFnbm9zdGljaWFuID0gbmV3IERpYWdub3N0aWNpYW4oKTsKKwkJCQlmaW5hbCBEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBkaWFnbm9zdGljaWFuLnZhbGlkYXRlKHJvb3RQYWNrYWdlKTsKKwkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpID09IERpYWdub3N0aWMuT0spIHsKKwkJCQkJcmV0dXJuIHJvb3RQYWNrYWdlOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIEEgdHV0b3JpYWwgb24gbWFya2VyczoKKwkJCQkgKiAKKwkJCQkgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtTWFyayUyME15JTIwV29yZHMvbWFyay1teS13b3Jkcy5odG1sCisJCQkJICogCisJCQkJICovCisKKwkJCQlDb21wVW5pdCBjb21wVW5pdCA9IChDb21wVW5pdCkgcGFyc2VDb250ZXh0LmdldFBhcnNlUm9vdCgpOworCQkJCWZvciAoRGlhZ25vc3RpYyBjaGlsZERpYWdub3N0aWMgOiBkaWFnbm9zdGljLmdldENoaWxkcmVuKCkpIHsKKwkJCQkJU2V0PEFTVE5vZGU+IHByb2JsZW1Ob2RlcyA9IG5ldyBIYXNoU2V0PEFTVE5vZGU+KCk7CisJCQkJCVN0cmluZyBkTXNnID0gY2hpbGREaWFnbm9zdGljLmdldE1lc3NhZ2UoKTsKKwkJCQkJaWYgKGNoaWxkRGlhZ25vc3RpYy5nZXREYXRhKCkuc2l6ZSgpID4gMCkgeworCQkJCQkJT2JqZWN0IHByaW1hcnlTb3VyY2VPZlByb2JsZW0gPSBjaGlsZERpYWdub3N0aWMuZ2V0RGF0YSgpLmdldCgwKTsKKwkJCQkJCWlmIChwcmltYXJ5U291cmNlT2ZQcm9ibGVtICE9IG51bGwgJiYgcHJpbWFyeVNvdXJjZU9mUHJvYmxlbSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCQkJCQlTZXQ8QVNUTm9kZT4gY3N0VXNlcyA9IGNvbXBVbml0LmdldEVjb3JlRGVjbDJDc3RVc2UoKS5nZXQoKEVPYmplY3QpIHByaW1hcnlTb3VyY2VPZlByb2JsZW0pOworCQkJCQkJCXByb2JsZW1Ob2Rlcy5hZGRBbGwoY3N0VXNlcyk7CisJCQkJCQkJaWYgKHByb2JsZW1Ob2Rlcy5zaXplKCkgPT0gMCkgeworCQkJCQkJCQlwcm9ibGVtTm9kZXMuYWRkKGNvbXBVbml0LmdldFBhY2thZ2VEZWNsKCkpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlmb3IgKEFTVE5vZGUgcHJvYmxlbU5vZGUgOiBwcm9ibGVtTm9kZXMpIHsKKwkJCQkJCVBhcnNlTWVzc2FnZSBwTXNnID0gbmV3IEVtZmF0aWNTZW1hbnRpY1dhcm5pbmcuRWNvcmVWYWxpZGF0b3JEaWFnbm9zdGljKHByb2JsZW1Ob2RlLCBkTXNnKTsKKwkJCQkJCXBhcnNlQ29udGV4dC5hZGRQYXJzZU1lc3NhZ2UocE1zZyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHJvb3RQYWNrYWdlOworCX0KKworCXByaXZhdGUgQ29tcFVuaXQgcGFyc2VDb21wVW5pdChFbWZhdGljUGFyc2VyIHBhcnNlciwgUGFyc2VDb250ZXh0IHBhcnNlQ29udGV4dCkgeworCSAgICB0cnkgeworCSAgICAgICAgQ29tcFVuaXQgY29tcFVuaXQgPSBwYXJzZXIuY29tcFVuaXQoKTsKKwkgICAgICAgIHBhcnNlQ29udGV4dC5zZXRQYXJzZVJvb3QoY29tcFVuaXQpOworCSAgICAgICAgcmV0dXJuIGNvbXBVbml0OyAKKwkgICAgfQorCSAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmV4KSB7CisJICAgICAgICBwYXJzZUNvbnRleHQuYWRkUGFyc2VNZXNzYWdlKGNyZWF0ZVBhcnNlRXJyb3IocmV4KSk7CisJICAgIH0KKwkgICAgY2F0Y2ggKFRva2VuU3RyZWFtUmVjb2duaXRpb25FeGNlcHRpb24gdGV4KSB7CisJICAgIAlSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZXggPSB0ZXgucmVjb2c7CisJICAgICAgICBwYXJzZUNvbnRleHQuYWRkUGFyc2VNZXNzYWdlKGNyZWF0ZVBhcnNlRXJyb3IocmV4KSk7CisJICAgIH0KKwkgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCSAgICAgICAgcGFyc2VDb250ZXh0LmFkZFBhcnNlTWVzc2FnZShuZXcgUGFyc2VFcnJvcihleC5nZXRNZXNzYWdlKCksIDEpKTsKKwkgICAgfQorCSAgICByZXR1cm4gbnVsbDsgCisJfQorCXN0YXRpYyBQYXJzZUVycm9yIGNyZWF0ZVBhcnNlRXJyb3IoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJU3RyaW5nIG1lc3NhZ2UgPSBleC5nZXRNZXNzYWdlKCk7CisJCWludCBvZmZzZXQgPSBleC5nZXRDb2x1bW4oKTsKKwkJaW50IGxlbmd0aCA9IDA7CisKKwkJaWYgKGV4IGluc3RhbmNlb2YgTWlzbWF0Y2hlZENoYXJFeGNlcHRpb24pIHsKKwkJCWxlbmd0aCA9IDE7CisJCX0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBNaXNtYXRjaGVkVG9rZW5FeGNlcHRpb24pIHsKKwkJCU1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbiBleDIgPSAoTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKSBleDsKKwkJCWlmICgoZXgyLnRva2VuICE9IG51bGwpICYmIChleDIudG9rZW4uZ2V0VGV4dCgpICE9IG51bGwpKSB7CisJCQkJbGVuZ3RoID0gZXgyLnRva2VuLmdldFRleHQoKS5sZW5ndGgoKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIE5vVmlhYmxlQWx0RXhjZXB0aW9uKSB7CisJCQlOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBleDIgPSAoTm9WaWFibGVBbHRFeGNlcHRpb24pIGV4OworCQkJaWYgKChleDIudG9rZW4gIT0gbnVsbCkgJiYgKGV4Mi50b2tlbi5nZXRUZXh0KCkgIT0gbnVsbCkpIHsKKwkJCQlsZW5ndGggPSBleDIudG9rZW4uZ2V0VGV4dCgpLmxlbmd0aCgpOworCQkJfQorCQl9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKSB7CisJCQlsZW5ndGggPSAxOworCQl9CisJCQorCQlyZXR1cm4gbmV3IFBhcnNlRXJyb3IobWVzc2FnZSwgb2Zmc2V0LCBsZW5ndGgpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0FOVExSdjJwYXJzZXIvRW1mYXRpY1BhcnNlclRva2VuVHlwZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0FOVExSdjJwYXJzZXIvRW1mYXRpY1BhcnNlclRva2VuVHlwZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQ0NTNhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvQU5UTFJ2MnBhcnNlci9FbWZhdGljUGFyc2VyVG9rZW5UeXBlcy5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8vICRBTlRMUiA6ICJFbWZhdGljLmciIC0+ICJFbWZhdGljTGV4ZXIuamF2YSIkCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5wYXJzZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuKjsKKworcHVibGljIGludGVyZmFjZSBFbWZhdGljUGFyc2VyVG9rZW5UeXBlcyB7CisJaW50IEVPRiA9IDE7CisJaW50IE5VTExfVFJFRV9MT09LQUhFQUQgPSAzOworCWludCBMSVRFUkFMX3BhY2thZ2UgPSA0OworCWludCBTRU1JID0gNTsKKwlpbnQgSUQgPSA2OworCWludCBET1QgPSA3OworCWludCBET0xMQVIgPSA4OworCWludCBTVFJJTkdfTElURVJBTCA9IDk7CisJaW50IEFUID0gMTA7CisJaW50IExQQVJFTiA9IDExOworCWludCBSUEFSRU4gPSAxMjsKKwlpbnQgQ09NTUEgPSAxMzsKKwlpbnQgRVFVQUxTID0gMTQ7CisJaW50IExJVEVSQUxfaW1wb3J0ID0gMTU7CisJaW50IExDVVJMWSA9IDE2OworCWludCBSQ1VSTFkgPSAxNzsKKwlpbnQgTElURVJBTF9leHRlbmRzID0gMTg7CisJaW50IENPTE9OID0gMTk7CisJaW50IExJVEVSQUxfYWJzdHJhY3QgPSAyMDsKKwlpbnQgTElURVJBTF9jbGFzcyA9IDIxOworCWludCBMSVRFUkFMX2ludGVyZmFjZSA9IDIyOworCWludCBMVCA9IDIzOworCWludCBHVCA9IDI0OworCWludCBBTVAgPSAyNTsKKwlpbnQgUU1BUksgPSAyNjsKKwlpbnQgTElURVJBTF9zdXBlciA9IDI3OworCWludCBMSVRFUkFMX2F0dHIgPSAyODsKKwlpbnQgTFNRVUFSRSA9IDI5OworCWludCBSU1FVQVJFID0gMzA7CisJaW50IERPVF9ET1QgPSAzMTsKKwlpbnQgU1RBUiA9IDMyOworCWludCBQTFVTID0gMzM7CisJaW50IElOVF9MSVRFUkFMID0gMzQ7CisJaW50IEhBU0ggPSAzNTsKKwlpbnQgTElURVJBTF9yZWYgPSAzNjsKKwlpbnQgTElURVJBTF92YWwgPSAzNzsKKwlpbnQgQkFORyA9IDM4OworCWludCBMSVRFUkFMX3JlYWRvbmx5ID0gMzk7CisJaW50IExJVEVSQUxfdm9sYXRpbGUgPSA0MDsKKwlpbnQgTElURVJBTF90cmFuc2llbnQgPSA0MTsKKwlpbnQgTElURVJBTF91bnNldHRhYmxlID0gNDI7CisJaW50IExJVEVSQUxfZGVyaXZlZCA9IDQzOworCWludCBMSVRFUkFMX3VuaXF1ZSA9IDQ0OworCWludCBMSVRFUkFMX29yZGVyZWQgPSA0NTsKKwlpbnQgTElURVJBTF9yZXNvbHZlID0gNDY7CisJaW50IExJVEVSQUxfaWQgPSA0NzsKKwlpbnQgTElURVJBTF90cnVlID0gNDg7CisJaW50IExJVEVSQUxfZmFsc2UgPSA0OTsKKwlpbnQgTUlOVVMgPSA1MDsKKwlpbnQgQ0hBUl9MSVRFUkFMID0gNTE7CisJaW50IExJVEVSQUxfb3AgPSA1MjsKKwlpbnQgTElURVJBTF90aHJvd3MgPSA1MzsKKwlpbnQgTElURVJBTF92b2lkID0gNTQ7CisJaW50IExJVEVSQUxfZGF0YXR5cGUgPSA1NTsKKwlpbnQgTElURVJBTF9lbnVtID0gNTY7CisJaW50IExJVEVSQUxfbWFwZW50cnkgPSA1NzsKKwlpbnQgTUlOVVNfR1QgPSA1ODsKKwlpbnQgR1RfTFQgPSA1OTsKKwlpbnQgTFRfR1QgPSA2MDsKKwlpbnQgRVNDID0gNjE7CisJaW50IERJR0lUID0gNjI7CisJaW50IFdTID0gNjM7CisJaW50IFNJTkdMRV9MSU5FX0NPTU1FTlQgPSA2NDsKKwlpbnQgTVVMVElfTElORV9DT01NRU5UID0gNjU7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9BTlRMUnYycGFyc2VyL0VtZmF0aWNQYXJzZXJUb2tlblR5cGVzLnR4dCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0FOVExSdjJwYXJzZXIvRW1mYXRpY1BhcnNlclRva2VuVHlwZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZTZiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9BTlRMUnYycGFyc2VyL0VtZmF0aWNQYXJzZXJUb2tlblR5cGVzLnR4dApAQCAtMCwwICsxLDY0IEBACisvLyAkQU5UTFIgOiBFbWZhdGljLmcgLT4gRW1mYXRpY1BhcnNlclRva2VuVHlwZXMudHh0JAorRW1mYXRpY1BhcnNlciAgICAvLyBvdXRwdXQgdG9rZW4gdm9jYWIgbmFtZQorTElURVJBTF9wYWNrYWdlPSJwYWNrYWdlIj00CitTRU1JPTUKK0lEPTYKK0RPVD03CitET0xMQVI9OAorU1RSSU5HX0xJVEVSQUw9OQorQVQ9MTAKK0xQQVJFTj0xMQorUlBBUkVOPTEyCitDT01NQT0xMworRVFVQUxTPTE0CitMSVRFUkFMX2ltcG9ydD0iaW1wb3J0Ij0xNQorTENVUkxZPTE2CitSQ1VSTFk9MTcKK0xJVEVSQUxfZXh0ZW5kcz0iZXh0ZW5kcyI9MTgKK0NPTE9OPTE5CitMSVRFUkFMX2Fic3RyYWN0PSJhYnN0cmFjdCI9MjAKK0xJVEVSQUxfY2xhc3M9ImNsYXNzIj0yMQorTElURVJBTF9pbnRlcmZhY2U9ImludGVyZmFjZSI9MjIKK0xUPTIzCitHVD0yNAorQU1QPTI1CitRTUFSSz0yNgorTElURVJBTF9zdXBlcj0ic3VwZXIiPTI3CitMSVRFUkFMX2F0dHI9ImF0dHIiPTI4CitMU1FVQVJFPTI5CitSU1FVQVJFPTMwCitET1RfRE9UPTMxCitTVEFSPTMyCitQTFVTPTMzCitJTlRfTElURVJBTD0zNAorSEFTSD0zNQorTElURVJBTF9yZWY9InJlZiI9MzYKK0xJVEVSQUxfdmFsPSJ2YWwiPTM3CitCQU5HPTM4CitMSVRFUkFMX3JlYWRvbmx5PSJyZWFkb25seSI9MzkKK0xJVEVSQUxfdm9sYXRpbGU9InZvbGF0aWxlIj00MAorTElURVJBTF90cmFuc2llbnQ9InRyYW5zaWVudCI9NDEKK0xJVEVSQUxfdW5zZXR0YWJsZT0idW5zZXR0YWJsZSI9NDIKK0xJVEVSQUxfZGVyaXZlZD0iZGVyaXZlZCI9NDMKK0xJVEVSQUxfdW5pcXVlPSJ1bmlxdWUiPTQ0CitMSVRFUkFMX29yZGVyZWQ9Im9yZGVyZWQiPTQ1CitMSVRFUkFMX3Jlc29sdmU9InJlc29sdmUiPTQ2CitMSVRFUkFMX2lkPSJpZCI9NDcKK0xJVEVSQUxfdHJ1ZT0idHJ1ZSI9NDgKK0xJVEVSQUxfZmFsc2U9ImZhbHNlIj00OQorTUlOVVM9NTAKK0NIQVJfTElURVJBTD01MQorTElURVJBTF9vcD0ib3AiPTUyCitMSVRFUkFMX3Rocm93cz0idGhyb3dzIj01MworTElURVJBTF92b2lkPSJ2b2lkIj01NAorTElURVJBTF9kYXRhdHlwZT0iZGF0YXR5cGUiPTU1CitMSVRFUkFMX2VudW09ImVudW0iPTU2CitMSVRFUkFMX21hcGVudHJ5PSJtYXBlbnRyeSI9NTcKK01JTlVTX0dUPTU4CitHVF9MVD01OQorTFRfR1Q9NjAKK0VTQz02MQorRElHSVQ9NjIKK1dTPTYzCitTSU5HTEVfTElORV9DT01NRU5UPTY0CitNVUxUSV9MSU5FX0NPTU1FTlQ9NjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0VtZmF0aWMuYXN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvRW1mYXRpYy5hc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczYzU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL0VtZmF0aWMuYXN0CkBAIC0wLDAgKzEsMTE5IEBACitsYW5ndWFnZSBFbWZhdGljOworCitvcHRpb25zIHsgaz0zOyAKKyAgICAgICAgICBwYXJzZXJQYWNrYWdlTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXIiOyAKKyAgICAgICAgICBhc3RQYWNrYWdlTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QiOyAKKyAgICAgICAgICBhc3RCYXNlQ2xhc3NOYW1lPSJFbWZhdGljQVNUTm9kZSI7CisgICAgICAgIH0KKworCitzZXF1ZW5jZSBjb21wVW5pdCBbZW50cnldIDogcGFja2FnZURlY2wgaW1wb3J0U3RtdHMgdG9wTGV2ZWxEZWNscyAgOworCitzZXF1ZW5jZSBwYWNrYWdlRGVjbCA6IGFubm90YXRpb25zICJwYWNrYWdlIiBuYW1lPXF1YWxpZmllZElEIFNFTUkgOworCitsaXN0IHF1YWxpZmllZElEIDogaWQxPUlEIChxaWRTZXBhcmF0b3IgaWRuPUlEKSogOwordG9rZW4gcWlkU2VwYXJhdG9yIDogRE9UIHwgRE9MTEFSIDsKKworYWJzdHJhY3Qgc3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgOiBzdHJpbmdMaXRlcmFsQ29udGFpbmVyIHwgcXVhbGlmaWVkSURDb250YWluZXIgOworc2VxdWVuY2Ugc3RyaW5nTGl0ZXJhbENvbnRhaW5lciA6IFNUUklOR19MSVRFUkFMIDsKK3NlcXVlbmNlIHF1YWxpZmllZElEQ29udGFpbmVyIDogcXVhbGlmaWVkSUQgOworCitsaXN0IGFubm90YXRpb25zIDogYW5ub3RhdGlvbiogOworc2VxdWVuY2UgYW5ub3RhdGlvbiA6IEFUIHNvdXJjZT1zdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBMUEFSRU4ga2V5RXF1YWxzVmFsdWVMaXN0IFJQQVJFTiA7CitsaXN0IGtleUVxdWFsc1ZhbHVlTGlzdCA6IGt2MT1rZXlFcXVhbHNWYWx1ZSAoQ09NTUEga3ZuPWtleUVxdWFsc1ZhbHVlKSogOworc2VxdWVuY2Uga2V5RXF1YWxzVmFsdWUgOiBrZXk9c3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgRVFVQUxTIHZhbHVlPXN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIDsKKworbGlzdCBpbXBvcnRTdG10cyA6IGltcG9ydFN0bXQqIDsgCisKK3NlcXVlbmNlIGltcG9ydFN0bXQgOiAiaW1wb3J0IiAoYWxpYXM9SUQgRVFVQUxTKT8gdXJpPXN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIFNFTUkgOworCitsaXN0IHRvcExldmVsRGVjbHMgOiB0b3BMZXZlbERlY2wqIDsKKworYWJzdHJhY3QgdG9wTGV2ZWxEZWNsIDogKGFubm90YXRpb25zKSAKKyAgc3ViUGFja2FnZURlY2wgfCBjbGFzc0RlY2wgfCBkYXRhVHlwZURlY2wgfCBlbnVtRGVjbCB8IG1hcEVudHJ5RGVjbCA7CisKK3NlcXVlbmNlIHN1YlBhY2thZ2VEZWNsIDogInBhY2thZ2UiIG5hbWU9SUQgTENVUkxZIHRvcExldmVsRGVjbHMgUkNVUkxZIDsKKworc2VxdWVuY2UgY2xhc3NEZWNsIDogKGFic3RyYWN0TW9kaWZpZXIpPyAKKyAgICAgICAgICAgICAgICAgICAgIGNsYXNzS2luZCBuYW1lPUlEIAorICAgICAgICAgICAgICAgICAgICAgKHR5cGVQYXJhbXNJbmZvPXR5cGVQYXJhbXNJbmZvKT8KKyAgICAgICAgICAgICAgICAgICAgICgiZXh0ZW5kcyIgc3VwZXJUeXBlcz1jb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQpPyAKKyAgICAgICAgICAgICAgICAgICAgIChDT0xPTiBpbnN0Q2xhc3NOYW1lPWJvdW5kRXhjZXB0V2lsZGNhcmQpPyAKKyAgICAgICAgICAgICAgICAgICAgIExDVVJMWSBjbGFzc01lbWJlckRlY2xzIFJDVVJMWSA7CitsaXN0IGNvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCA6IHRiMT1ib3VuZEV4Y2VwdFdpbGRjYXJkIChDT01NQSB0Ym49Ym91bmRFeGNlcHRXaWxkY2FyZCkqOworCitzZXF1ZW5jZSBhYnN0cmFjdE1vZGlmaWVyIDogImFic3RyYWN0IiA7Cit0b2tlbiBjbGFzc0tpbmQgOiAiY2xhc3MiIHwgImludGVyZmFjZSIgOworCitzZXF1ZW5jZSB0eXBlUGFyYW1zSW5mbyA6IExUIG9uZU9yTW9yZVR5cGVQYXJhbXMgR1QgOyAKK2xpc3Qgb25lT3JNb3JlVHlwZVBhcmFtcyA6IHRwMT10eXBlUGFyYW0gKENPTU1BIHRwbj10eXBlUGFyYW0pKiA7CitzZXF1ZW5jZSB0eXBlUGFyYW0gOiB0eXBlVmFyTmFtZT1JRCAodHlwZUJvdW5kc0luZm89dHlwZUJvdW5kc0luZm8pPyA7IAorc2VxdWVuY2UgdHlwZUJvdW5kc0luZm8gOiAiZXh0ZW5kcyIgb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzIDsgCitsaXN0IG9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyA6IHRiMT1ib3VuZEV4Y2VwdFdpbGRjYXJkIChBTVAgdGJuPWJvdW5kRXhjZXB0V2lsZGNhcmQpKjsgCitzZXF1ZW5jZSBib3VuZEV4Y2VwdFdpbGRjYXJkIDogcmF3VE5hbWVPclRWYXJPclBhcmFtemVkVE5hbWU9cXVhbGlmaWVkSUQgKExUIG9uZU9yTW9yZVR5cGVBcmdzIEdUKT8gOyAKK2xpc3Qgb25lT3JNb3JlVHlwZUFyZ3MgOiB0YTE9dHlwZUFyZyAoQ09NTUEgdGFuPXR5cGVBcmcpKjsKK2Fic3RyYWN0IHR5cGVBcmcgOiBib3VuZEV4Y2VwdFdpbGRjYXJkIHwgd2lsZGNhcmQgIDsKK3NlcXVlbmNlIHdpbGRjYXJkIDogUU1BUksgKCBleHRlbmRzT3JTdXBlciBib3VuZEV4Y2VwdFdpbGRjYXJkICk/IDsgCit0b2tlbiBleHRlbmRzT3JTdXBlciA6ICJleHRlbmRzIiB8ICJzdXBlciIgOyAKKworLy8gdGhlcmUgYXJlIG5vIGFycmF5IHR5cGVzIGluIEVNRgorLyogZG90IG1lYW5zIHBhY2thZ2UgbmVzdGluZywgdGhlcmUgYXJlIG5vIGlubmVyIGNsYXNzZXMgaW4gRU1GICovCisKKworbGlzdCBjbGFzc01lbWJlckRlY2xzIDogY2xhc3NNZW1iZXJEZWNsKiA7CithYnN0cmFjdCBjbGFzc01lbWJlckRlY2wgOiAoYW5ub3RhdGlvbnMgbW9kaWZpZXJzKSBhdHRyaWJ1dGUgfCByZWZlcmVuY2UgfCBvcGVyYXRpb24gOworCitzZXF1ZW5jZSBhdHRyaWJ1dGUgOiAiYXR0ciIgdHlwZVdpdGhNdWx0aSBuYW1lPUlEIChFUVVBTFMgZGVmYXVsdFZhbHVlRXhwcik/IFNFTUkgOyAKKworc2VxdWVuY2UgdHlwZVdpdGhNdWx0aSA6IG5hbWU9Ym91bmRFeGNlcHRXaWxkY2FyZCAobXVsdGlwbGljaXR5KT8gOworCitzZXF1ZW5jZSBtdWx0aXBsaWNpdHkgOiBMU1FVQVJFIChtdWx0aXBsaWNpdHlFeHByKT8gUlNRVUFSRSA7CitzZXF1ZW5jZSBtdWx0aXBsaWNpdHlFeHByIDogbG93ZXJCb3VuZD1zaW1wbGVNdWx0aXBsaWNpdHlFeHByIChET1RfRE9UIHVwcGVyQm91bmQ9c2ltcGxlTXVsdGlwbGljaXR5RXhwcik/IDsKK3Rva2VuIHNpbXBsZU11bHRpcGxpY2l0eUV4cHIgOiBTVEFSIHwgUExVUyB8IFFNQVJLIHwgSU5UX0xJVEVSQUwgOworCitzZXF1ZW5jZSByZWZlcmVuY2UgOiByZWZlcmVuY2VLaW5kIHR5cGVXaXRoTXVsdGkgKEhBU0ggb3Bwb3NpdGVOYW1lPUlEKT8gbmFtZT1JRCBTRU1JIDsKK3Rva2VuIHJlZmVyZW5jZUtpbmQgOiAicmVmIiB8ICJ2YWwiIDsKKworbGlzdCBtb2RpZmllcnMgOiBvcHROZWdhdGVkTW9kaWZpZXIqIDsKK3NlcXVlbmNlIG9wdE5lZ2F0ZWRNb2RpZmllciA6IChCQU5HKT8gbW9kaWZpZXIgOwordG9rZW4gbW9kaWZpZXIKKy8vIGtleXdvcmQgICAgICAgIEVNRiBtZWFuaW5nCis6ICJyZWFkb25seSIgICAvLyBFU3RydWN0dXJhbEZlYXR1cmUuY2hhbmdlYWJsZSA9IGZhbHNlCit8ICJ2b2xhdGlsZSIgICAvLyBFU3RydWN0dXJhbEZlYXR1cmUudm9sYXRpbGUgICA9IHRydWUKK3wgInRyYW5zaWVudCIgIC8vIEVTdHJ1Y3R1cmFsRmVhdHVyZS50cmFuc2llbnQgID0gdHJ1ZQorfCAidW5zZXR0YWJsZSIgLy8gRVN0cnVjdHVyYWxGZWF0dXJlLnVuc2V0dGFibGUgPSB0cnVlCit8ICJkZXJpdmVkIiAgICAvLyBFU3RydWN0dXJhbEZlYXR1cmUuZGVyaXZlZCAgICA9IHRydWUKK3wgInVuaXF1ZSIgICAgIC8vICpFVHlwZWRFbGVtZW50LnVuaXF1ZSAgICAgICAgID0gdHJ1ZSAgLS0gYmFnPworfCAib3JkZXJlZCIgICAgLy8gKkVUeXBlZEVsZW1lbnQub3JkZXJlZCAgICAgICAgPSB0cnVlICAtLSByYW5kb20/Cit8ICJyZXNvbHZlIiAgICAvLyAqRVJlZmVyZW5jZS5yZXNvbHZlUHJveGllcyAgICA9IHRydWUgIC0tIGxvY2FsPworfCAiaWQiICAgICAgICAgLy8gRUF0dHJpYnV0ZS5pZCAgICAgICAgICAgICAgICAgPSB0cnVlCis7CisKK2Fic3RyYWN0IGRlZmF1bHRWYWx1ZUV4cHIgOiBib29sRXhwciB8IGludEV4cHIgfCBzdHJpbmdFeHByIHwgY2hhckV4cHIgOworc2VxdWVuY2UgYm9vbEV4cHIgOiB0cnVlT3JGYWxzZSA7Cit0b2tlbiB0cnVlT3JGYWxzZSA6ICJ0cnVlIiB8ICJmYWxzZSIgOworc2VxdWVuY2UgaW50RXhwciA6IChNSU5VUyk/IElOVF9MSVRFUkFMIDsKK3NlcXVlbmNlIHN0cmluZ0V4cHIgOiBTVFJJTkdfTElURVJBTCA7CitzZXF1ZW5jZSBjaGFyRXhwciA6IENIQVJfTElURVJBTCA7CisKK3NlcXVlbmNlIG9wZXJhdGlvbiA6ICJvcCIgKHR5cGVQYXJhbXNJbmZvPXR5cGVQYXJhbXNJbmZvKT8gCisgICByZXNUeXBlPXJlc3VsdFR5cGUgbmFtZT1JRCBMUEFSRU4gKHBhcmFtcyk/IFJQQVJFTiAKKyAgICgidGhyb3dzIiBleGNlcHRpb25zPWNvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCk/IFNFTUkgOworCithYnN0cmFjdCByZXN1bHRUeXBlIDogdHlwZVdpdGhNdWx0aSB8IHZvaWRDb250YWluZXIgOyAKK3NlcXVlbmNlIHZvaWRDb250YWluZXIgOiAidm9pZCIgOyAKKworbGlzdCBwYXJhbXMgOiBwMT1wYXJhbSAoQ09NTUEgcG49cGFyYW0pKjsgCitzZXF1ZW5jZSBwYXJhbSA6IGxlYWRpbmdBbm5vdGF0aW9ucz1hbm5vdGF0aW9ucyBtb2RpZmllcnMgdHlwZVdpdGhNdWx0aSBuYW1lPUlEIHRyYWlsaW5nQW5ub3RhdGlvbnM9YW5ub3RhdGlvbnMgOworCisvLyAidHJhbnNpZW50IiBtZWFucyAhc2VyaWFsaXphYmxlCitzZXF1ZW5jZSBkYXRhVHlwZURlY2wgOiAodHJhbnNpZW50TW9kaWZpZXIpPyAiZGF0YXR5cGUiIG5hbWU9SUQgQ09MT04gaW5zdENsYXNzTmFtZT1zdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBTRU1JIDsgLy8gVE9ETyBkYXRhdHlwZXMgc2hvdWxkIGFjY2VwdCB0eXBlIHBhcmFtZXRlcnMKK3NlcXVlbmNlIHRyYW5zaWVudE1vZGlmaWVyIDogInRyYW5zaWVudCIgOworCitzZXF1ZW5jZSBlbnVtRGVjbCA6ICJlbnVtIiBuYW1lPUlEIExDVVJMWSBlbnVtTGl0ZXJhbHMgUkNVUkxZIDsKK2xpc3QgZW51bUxpdGVyYWxzIDogZW51bUxpdGVyYWwqIDsKK3NlcXVlbmNlIGVudW1MaXRlcmFsIDogbGVhZGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zIG5hbWU9SUQgKEVRVUFMUyB2YWw9SU5UX0xJVEVSQUwpPyB0cmFpbGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zIFNFTUkgOworCitzZXF1ZW5jZSBtYXBFbnRyeURlY2wgOiAibWFwZW50cnkiIG5hbWU9SUQgQ09MT04ga2V5PXR5cGVXaXRoTXVsdGkgTUlOVVNfR1QgdmFsdWU9dHlwZVdpdGhNdWx0aSBTRU1JIDsKKworLy8gdGhlIGZvbGxvd2luZyB0b2tlbnMgd2VyZSBhZGRlZCB0byBjYXRlciBmb3IgZ2VuZXJpY3Mgc3ludGF4IDogQU1QLCBMVCwgR1QgCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvRW1mYXRpYzIuamogYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvRW1mYXRpYzIuamoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxYTVhOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL2phdmFjY1BhcnNlci9FbWZhdGljMi5qagpAQCAtMCwwICsxLDcxNiBAQAorLyoqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwOS4wMi4yMDA3IDEzOjAzOjA1CisgKi8KKworb3B0aW9ucyB7CisgIEpES19WRVJTSU9OID0gIjEuNSI7CisgIFNUQVRJQyA9IGZhbHNlIDsKKyAgTE9PS0FIRUFEPTQ7IAorICBGT1JDRV9MQV9DSEVDSyA9IHRydWU7IAorfQorCitQQVJTRVJfQkVHSU4oRW1mYXRpY1BhcnNlcikKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC4qOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY1BhcnNlciB7CisKKyAgcHVibGljIFRva2VuSW5mbyBjcmVhdGVUb2tlbkluZm8oVG9rZW4gdG9rKSB7CisgICAgaWYgKCEodG9rIGluc3RhbmNlb2YgRXh0VG9rZW4pKSByZXR1cm4gbnVsbDsKKyAgICAKKyAgICBFeHRUb2tlbiBleHRUb2tlbiA9IChFeHRUb2tlbikgdG9rOworICAgIHJldHVybiBuZXcgVG9rZW5JbmZvKHRvay5pbWFnZSwgZXh0VG9rZW4udG9rZW5PZmZzZXQsIHRvay5raW5kKTsKKyAgfQorCit9CitQQVJTRVJfRU5EKEVtZmF0aWNQYXJzZXIpCisKK1NLSVAgOgoreworICAgIDwgU0lOR0xFTElORUNPTU1FTlQgOiA8RE9VQkxFU0xBU0g+ICh+WyJcbiIsIlxyIl0pKiAoIlxuInwiXHJcbiIpPgorfCAgIDwgV1MgOiAoWyIgIiwgIlx0IiwgIlxmIiwgIlxyIiwgIlxuIl0pKyAgPgorfCAgICIvKiIgOiBXaXRoaW5Db21tZW50Cit9Cis8V2l0aGluQ29tbWVudD4gU0tJUCA6Cit7CisgICAgIiovIiA6IERFRkFVTFQKK30gICAgCis8V2l0aGluQ29tbWVudD4gTU9SRSAgOiAKK3sKKyAgICA8IH5bXSA+Cit9CisKK1RPS0VOIDogCit7CisgICAgPCBQQUNLQUdFS1cgICA6ICJwYWNrYWdlIiA+Cit8ICAgPCBDTEFTU0tXICAgOiAiY2xhc3MiID4KK3wgICA8IElNUE9SVEtXICA6ICJpbXBvcnQiID4KK3wgICA8IEFCU1RSQUNUS1cgIDogImFic3RyYWN0IiA+IAorfCAgIDwgSU5URVJGQUNFS1cgOiAiaW50ZXJmYWNlIiA+Cit8ICAgPCBFWFRFTkRTS1cgICA6ICJleHRlbmRzIiA+Cit8ICAgPCBTVVBFUktXICA6ICJzdXBlciIgPgorfCAgIDwgQVRUUktXICAgOiAiYXR0ciIgPiAgICAgICAgCit8ICAgPCBSRUZLVyAgICA6ICJyZWYiID4KK3wgICA8IFZBTEtXICAgOiAidmFsIiA+Cit8ICAgPCBSRUFET05MWUtXICAgOiAicmVhZG9ubHkiID4KK3wgICA8ICBWT0xBVElMRUtXIDogInZvbGF0aWxlIiA+Cit8ICAgPCAgVFJBTlNJRU5US1cgOiAidHJhbnNpZW50IiA+IAorfCAgIDwgIFVOU0VUVEFCTEVLVyA6ICJ1bnNldHRhYmxlIiA+ICAKK3wgICA8ICBERVJJVkVES1cgOiAiZGVyaXZlZCIgPgorfCAgIDwgIFVOSVFVRUtXIDogInVuaXF1ZSIgPiAKK3wgICA8ICBPUkRFUkVES1cgOiAib3JkZXJlZCIgPiAKK3wgICA8ICBSRVNPTFZFS1cgOiAicmVzb2x2ZSIgPgorfCAgIDwgIElES1cgOiAiaWQiID4gCit8ICAgPCAgVFJVRUtXIDogInRydWUiID4gIAorfCAgIDwgIEZBTFNFS1cgOiAiZmFsc2UiID4KK3wgICA8ICBPUEtXIDogIm9wIiA+IAorfCAgIDwgIFZPSURLVyA6ICJ2b2lkIiA+IAorfCAgIDwgIERBVEFUWVBFS1cgOiAiZGF0YXR5cGUiID4gCit8ICAgPCAgRU5VTUtXIDogImVudW0iID4gCit8ICAgPCAgTUFQRU5UUllLVyA6ICJtYXBlbnRyeSIgPiAKK3wgICA8ICBUSFJPV1NLVyA6ICJ0aHJvd3MiID4gCisKK3wJPCAjRE9VQkxFU0xBU0ggOiAiLy8iID4KK3wgICA8ICNET1VCTEVRVU9URSA6ICJcIiIgPiAKK3wgICA8ICNTSU5HTEVRVU9URSA6ICInIiAgPgorfCAgIDwgI0JBQ0tTTEFTSCAgIDogIlxcIiAgPgorCQorfAk8IExDVVJMWSAgOiAieyIgPiAKK3wgICA8IFJDVVJMWSAgOiAifSIgPgorfCAgIDwgTFNRVUFSRSA6ICJbIiA+IAorfCAgIDwgUlNRVUFSRSA6ICJdIiA+IAorfCAgIDwgTFBBUkVOICA6ICIoIiA+IAorfCAgIDwgUlBBUkVOICA6ICIpIiA+IAorCit8ICAgPCBET1QgICAgIDogIi4iPiAKK3wgICA8IENPTU1BICAgOiAiLCI+IAorfCAgIDwgQ09MT04gICA6ICI6Ij4gCit8ICAgPCBTRU1JICAgIDogIjsiPiAKKworfCAgIDwgU1RBUiAgICA6ICIqIj4gCit8ICAgPCBQTFVTICAgIDogIisiPiAKK3wgICA8IE1JTlVTICAgOiAiLSI+IAorfCAgIDwgRVFVQUxTICA6ICI9Ij4gCisKK3wgICA8IFFNQVJLICAgOiAiPyI+IAorfCAgIDwgQkFORyAgICA6ICIhIj4gCit8ICAgPCBET0xMQVIgIDogIiQiPiAKK3wgICA8IEhBU0ggICAgOiAiIyI+IAorfCAgIDwgQVQgICAgICA6ICJAIj4gCisKK3wgICA8IERPVF9ET1QgIDogIi4uIj4gCit8ICAgPCBNSU5VU19HVCA6ICItPiI+IAorfCAgIDwgR1RfTFQgICAgOiAiPjwiPiAKK3wgICA8IExUX0dUICAgIDogIjw+Ij4gCisKK3wgICA8IEFNUCA6ICImIiA+IAorfCAgIDwgTFQgIDogIjwiID4gCit8ICAgPCBHVCAgOiAiPiIgPiAKKworfCAgIDwgU1RSSU5HX0xJVEVSQUwgOiA8RE9VQkxFUVVPVEU+ICg8RVNDPiB8IH5bIlwiIl0pKiA8RE9VQkxFUVVPVEU+ID4KK3wgICA8IENIQVJfTElURVJBTCAgIDogPFNJTkdMRVFVT1RFPiAoPEVTQz4gfCAoflsiJyJdKSkgPFNJTkdMRVFVT1RFPiA+CisKK3wgICA8ICNMRVRURVJPUlVOREVSU0NPUkUgOiBbImEiLSJ6IiwgIkEiLSJaIiwgIl8iXSA+IAorfCAgIDwgI0xFVFRFUk9SVU5ERVJTQ09SRU9SRElHSVQgOiAoIDxMRVRURVJPUlVOREVSU0NPUkU+IHwgPERJR0lUPiApID4gCisKK3wgPCBJTlRfTElURVJBTCA6ICg8RElHSVQ+KSsgPiAKKworfCA8ICNESUdJVCA6IFsiMCItIjkiXSAgPiAKKworLy8gVE9ETzogVGhlIDxESUdJVERJR0lURElHSVQ+IGlzIGNoZWVzeSBpdCBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UKKy8vICAgICAgICggb3B0aW9ucyB7IHdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsgfSA6IChESUdJVCkrICkKKy8vICAgICAgIGJ1dCBJIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIHBhcnNpbmcgdGhhdCB5ZXQuCit8IDwgI0VTQyA6IDxCQUNLU0xBU0g+ICgidCIgfCAiZiIgfCAiciIgfCAibiIgfCA8RE9VQkxFUVVPVEU+IHwgPFNJTkdMRVFVT1RFPiB8IDxCQUNLU0xBU0g+IHwgPERJR0lURElHSVRESUdJVD4gKSA+IAorfCA8ICNESUdJVERJR0lURElHSVQgOiA8RElHSVQ+IDxESUdJVD4gPERJR0lUPiA+Cit9CisKK1RPS0VOIDoKK3sKKyA8IElEIDogKCJ+Iik/IDxMRVRURVJPUlVOREVSU0NPUkU+ICg8TEVUVEVST1JVTkRFUlNDT1JFT1JESUdJVD4pKiA+Cit9CisKKworQ29tcFVuaXQgY29tcFVuaXQoKSA6Cit7IENvbXBVbml0IHJldFZhbCA9IG51bGw7CisgIFBhY2thZ2VEZWNsIHBhY2thZ2VEZWNsID0gbnVsbDsKKyAgSW1wb3J0U3RtdHMgaW1wb3J0U3RtdHMgPSBudWxsOworICBUb3BMZXZlbERlY2xzIHRvcExldmVsRGVjbHMgPSBudWxsOyB9Cit7CitwYWNrYWdlRGVjbD1wYWNrYWdlRGVjbCgpIGltcG9ydFN0bXRzPWltcG9ydFN0bXRzKCkgdG9wTGV2ZWxEZWNscz10b3BMZXZlbERlY2xzKCkgPEVPRj4KKyAgeyByZXRWYWwgPSBuZXcgQ29tcFVuaXQocGFja2FnZURlY2wsIGltcG9ydFN0bXRzLCB0b3BMZXZlbERlY2xzKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK1BhY2thZ2VEZWNsIHBhY2thZ2VEZWNsKCkgOgoreyBQYWNrYWdlRGVjbCByZXRWYWwgPSBudWxsOworICBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyA9IG51bGw7CisgIFRva2VuIHBhY2thZ2VfS1cgPSBudWxsOworICBRdWFsaWZpZWRJRCBuYW1lID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7IH0KK3sKK2Fubm90YXRpb25zPWFubm90YXRpb25zKCkgcGFja2FnZV9LVz08UEFDS0FHRUtXPiBuYW1lPXF1YWxpZmllZElEKCkgc2VtaT08U0VNST4gCisgIHsgcmV0VmFsID0gbmV3IFBhY2thZ2VEZWNsKGFubm90YXRpb25zLCBjcmVhdGVUb2tlbkluZm8ocGFja2FnZV9LVyksIG5hbWUsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitRdWFsaWZpZWRJRCBxdWFsaWZpZWRJRCgpIDoKK3sgUXVhbGlmaWVkSUQgcmV0VmFsID0gbmV3IFF1YWxpZmllZElEKCk7CisgIFRva2VuIGlkMSA9IG51bGw7CisgIFFpZFNlcGFyYXRvciBxaWRTZXBhcmF0b3IgPSBudWxsOworICBUb2tlbiBpZG4gPSBudWxsOyB9Cit7ICggaWQxPTxJRD4geyByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGlkMSkpOyB9ICkKKyAgKCBxaWRTZXBhcmF0b3I9cWlkU2VwYXJhdG9yKCkgaWRuPTxJRD4geyByZXRWYWwuYWRkQ2hpbGQocWlkU2VwYXJhdG9yKTsgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhpZG4pKTsgfSApKiB7IHJldHVybiByZXRWYWw7IH0gfQorCitRaWRTZXBhcmF0b3IgcWlkU2VwYXJhdG9yKCkgOgoreyBUb2tlbiB0b2s7IH0KK3sgdG9rPTxET1Q+IHsgcmV0dXJuIG5ldyBRaWRTZXBhcmF0b3IgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PERPTExBUj4geyByZXR1cm4gbmV3IFFpZFNlcGFyYXRvciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit9CisKK1N0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKCkgOgoreyBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCByZXRWYWwgPSBudWxsOyB9Cit7CisgICggcmV0VmFsPXN0cmluZ0xpdGVyYWxDb250YWluZXIoKSB7IHJldHVybiByZXRWYWw7IH0KKyAgfCByZXRWYWw9cXVhbGlmaWVkSURDb250YWluZXIoKSB7IHJldHVybiByZXRWYWw7IH0KKyAgKQorfQorCitTdHJpbmdMaXRlcmFsQ29udGFpbmVyIHN0cmluZ0xpdGVyYWxDb250YWluZXIoKSA6Cit7IFN0cmluZ0xpdGVyYWxDb250YWluZXIgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gc3RyaW5nX2xpdGVyYWwgPSBudWxsOyB9Cit7CitzdHJpbmdfbGl0ZXJhbD08U1RSSU5HX0xJVEVSQUw+IAorICB7IHJldFZhbCA9IG5ldyBTdHJpbmdMaXRlcmFsQ29udGFpbmVyKGNyZWF0ZVRva2VuSW5mbyhzdHJpbmdfbGl0ZXJhbCkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworUXVhbGlmaWVkSURDb250YWluZXIgcXVhbGlmaWVkSURDb250YWluZXIoKSA6Cit7IFF1YWxpZmllZElEQ29udGFpbmVyIHJldFZhbCA9IG51bGw7CisgIFF1YWxpZmllZElEIHF1YWxpZmllZElEID0gbnVsbDsgfQoreworcXVhbGlmaWVkSUQ9cXVhbGlmaWVkSUQoKSAKKyAgeyByZXRWYWwgPSBuZXcgUXVhbGlmaWVkSURDb250YWluZXIocXVhbGlmaWVkSUQpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMoKSA6Cit7IEFubm90YXRpb25zIHJldFZhbCA9IG5ldyBBbm5vdGF0aW9ucygpOworICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBudWxsOyB9Cit7ICggYW5ub3RhdGlvbj1hbm5vdGF0aW9uKCkgeyByZXRWYWwuYWRkQ2hpbGQoYW5ub3RhdGlvbik7IH0gKSogeyByZXR1cm4gcmV0VmFsOyB9IH0KKworQW5ub3RhdGlvbiBhbm5vdGF0aW9uKCkgOgoreyBBbm5vdGF0aW9uIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGF0ID0gbnVsbDsKKyAgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgc291cmNlID0gbnVsbDsKKyAgVG9rZW4gbHBhcmVuID0gbnVsbDsKKyAgS2V5RXF1YWxzVmFsdWVMaXN0IGtleUVxdWFsc1ZhbHVlTGlzdCA9IG51bGw7CisgIFRva2VuIHJwYXJlbiA9IG51bGw7IH0KK3sKK2F0PTxBVD4gc291cmNlPXN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKCkgbHBhcmVuPTxMUEFSRU4+IGtleUVxdWFsc1ZhbHVlTGlzdD1rZXlFcXVhbHNWYWx1ZUxpc3QoKSBycGFyZW49PFJQQVJFTj4gCisgIHsgcmV0VmFsID0gbmV3IEFubm90YXRpb24oY3JlYXRlVG9rZW5JbmZvKGF0KSwgc291cmNlLCBjcmVhdGVUb2tlbkluZm8obHBhcmVuKSwga2V5RXF1YWxzVmFsdWVMaXN0LCBjcmVhdGVUb2tlbkluZm8ocnBhcmVuKSk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitLZXlFcXVhbHNWYWx1ZUxpc3Qga2V5RXF1YWxzVmFsdWVMaXN0KCkgOgoreyBLZXlFcXVhbHNWYWx1ZUxpc3QgcmV0VmFsID0gbmV3IEtleUVxdWFsc1ZhbHVlTGlzdCgpOworICBLZXlFcXVhbHNWYWx1ZSBrdjEgPSBudWxsOworICBUb2tlbiBjb21tYSA9IG51bGw7CisgIEtleUVxdWFsc1ZhbHVlIGt2biA9IG51bGw7IH0KK3sgKCBrdjE9a2V5RXF1YWxzVmFsdWUoKSB7IHJldFZhbC5hZGRDaGlsZChrdjEpOyB9ICkKKyAgKCBjb21tYT08Q09NTUE+IGt2bj1rZXlFcXVhbHNWYWx1ZSgpIHsgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhjb21tYSkpOyByZXRWYWwuYWRkQ2hpbGQoa3ZuKTsgfSApKiB7IHJldHVybiByZXRWYWw7IH0gfQorCitLZXlFcXVhbHNWYWx1ZSBrZXlFcXVhbHNWYWx1ZSgpIDoKK3sgS2V5RXF1YWxzVmFsdWUgcmV0VmFsID0gbnVsbDsKKyAgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQga2V5ID0gbnVsbDsKKyAgVG9rZW4gZXF1YWxzID0gbnVsbDsKKyAgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgdmFsdWUgPSBudWxsOyB9Cit7CitrZXk9c3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKSBlcXVhbHM9PEVRVUFMUz4gdmFsdWU9c3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKSAKKyAgeyByZXRWYWwgPSBuZXcgS2V5RXF1YWxzVmFsdWUoa2V5LCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgdmFsdWUpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworSW1wb3J0U3RtdHMgaW1wb3J0U3RtdHMoKSA6Cit7IEltcG9ydFN0bXRzIHJldFZhbCA9IG5ldyBJbXBvcnRTdG10cygpOworICBJbXBvcnRTdG10IGltcG9ydFN0bXQgPSBudWxsOyB9Cit7ICggaW1wb3J0U3RtdD1pbXBvcnRTdG10KCkgeyByZXRWYWwuYWRkQ2hpbGQoaW1wb3J0U3RtdCk7IH0gKSogeyByZXR1cm4gcmV0VmFsOyB9IH0KKworSW1wb3J0U3RtdCBpbXBvcnRTdG10KCkgOgorCit7IEltcG9ydFN0bXQgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gaW1wb3J0X0tXID0gbnVsbDsKKyAgVG9rZW4gYWxpYXMgPSBudWxsOworICBUb2tlbiBlcXVhbHMgPSBudWxsOworICBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCB1cmkgPSBudWxsOworICBUb2tlbiBzZW1pID0gbnVsbDsgfQoreworaW1wb3J0X0tXPTxJTVBPUlRLVz4gKCBhbGlhcz08SUQ+IGVxdWFscz08RVFVQUxTPiApPyB1cmk9c3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKSBzZW1pPTxTRU1JPiAKKyAgeyByZXRWYWwgPSBuZXcgSW1wb3J0U3RtdChjcmVhdGVUb2tlbkluZm8oaW1wb3J0X0tXKSwgY3JlYXRlVG9rZW5JbmZvKGFsaWFzKSwgY3JlYXRlVG9rZW5JbmZvKGVxdWFscyksIHVyaSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK1RvcExldmVsRGVjbHMgdG9wTGV2ZWxEZWNscygpIDoKK3sgVG9wTGV2ZWxEZWNscyByZXRWYWwgPSBuZXcgVG9wTGV2ZWxEZWNscygpOworICBUb3BMZXZlbERlY2wgdG9wTGV2ZWxEZWNsID0gbnVsbDsgfQoreyAoIHRvcExldmVsRGVjbD10b3BMZXZlbERlY2woKSB7IHJldFZhbC5hZGRDaGlsZCh0b3BMZXZlbERlY2wpOyB9ICkqIHsgcmV0dXJuIHJldFZhbDsgfSB9CisKK1RvcExldmVsRGVjbCB0b3BMZXZlbERlY2woKSA6Cit7IFRvcExldmVsRGVjbCByZXRWYWwgPSBudWxsOworICBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyA9IG51bGw7IH0KK3sKK2Fubm90YXRpb25zPWFubm90YXRpb25zKCkgCisgICggcmV0VmFsPXN1YlBhY2thZ2VEZWNsKGFubm90YXRpb25zKSB7IHJldHVybiByZXRWYWw7IH0KKyAgfCByZXRWYWw9Y2xhc3NEZWNsKGFubm90YXRpb25zKSB7IHJldHVybiByZXRWYWw7IH0KKyAgfCByZXRWYWw9ZGF0YVR5cGVEZWNsKGFubm90YXRpb25zKSB7IHJldHVybiByZXRWYWw7IH0KKyAgfCByZXRWYWw9ZW51bURlY2woYW5ub3RhdGlvbnMpIHsgcmV0dXJuIHJldFZhbDsgfQorICB8IHJldFZhbD1tYXBFbnRyeURlY2woYW5ub3RhdGlvbnMpIHsgcmV0dXJuIHJldFZhbDsgfQorICApCit9CisKK1N1YlBhY2thZ2VEZWNsIHN1YlBhY2thZ2VEZWNsKEFubm90YXRpb25zIGFubm90YXRpb25zKSA6Cit7IFN1YlBhY2thZ2VEZWNsIHJldFZhbCA9IG51bGw7CisgIFRva2VuIHBhY2thZ2VfS1cgPSBudWxsOworICBUb2tlbiBuYW1lID0gbnVsbDsKKyAgVG9rZW4gbGN1cmx5ID0gbnVsbDsKKyAgVG9wTGV2ZWxEZWNscyB0b3BMZXZlbERlY2xzID0gbnVsbDsKKyAgVG9rZW4gcmN1cmx5ID0gbnVsbDsgfQoreworcGFja2FnZV9LVz08UEFDS0FHRUtXPiBuYW1lPTxJRD4gbGN1cmx5PTxMQ1VSTFk+IHRvcExldmVsRGVjbHM9dG9wTGV2ZWxEZWNscygpIHJjdXJseT08UkNVUkxZPiAKKyAgeyByZXRWYWwgPSBuZXcgU3ViUGFja2FnZURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhwYWNrYWdlX0tXKSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8obGN1cmx5KSwgdG9wTGV2ZWxEZWNscywgY3JlYXRlVG9rZW5JbmZvKHJjdXJseSkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworQ2xhc3NEZWNsIGNsYXNzRGVjbChBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucykgOgoreyBDbGFzc0RlY2wgcmV0VmFsID0gbnVsbDsKKyAgQWJzdHJhY3RNb2RpZmllciBhYnN0cmFjdE1vZGlmaWVyID0gbnVsbDsKKyAgQ2xhc3NLaW5kIGNsYXNzS2luZCA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUeXBlUGFyYW1zSW5mbyB0eXBlUGFyYW1zSW5mbyA9IG51bGw7CisgIFRva2VuIGV4dGVuZHNfS1cgPSBudWxsOworICBDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQgc3VwZXJUeXBlcyA9IG51bGw7CisgIFRva2VuIGNvbG9uID0gbnVsbDsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCBpbnN0Q2xhc3NOYW1lID0gbnVsbDsKKyAgVG9rZW4gbGN1cmx5ID0gbnVsbDsKKyAgQ2xhc3NNZW1iZXJEZWNscyBjbGFzc01lbWJlckRlY2xzID0gbnVsbDsKKyAgVG9rZW4gcmN1cmx5ID0gbnVsbDsgfQoreworKCBhYnN0cmFjdE1vZGlmaWVyPWFic3RyYWN0TW9kaWZpZXIoKSApPyBjbGFzc0tpbmQ9Y2xhc3NLaW5kKCkgbmFtZT08SUQ+ICggdHlwZVBhcmFtc0luZm89dHlwZVBhcmFtc0luZm8oKSApPyAoIGV4dGVuZHNfS1c9ImV4dGVuZHMiIHN1cGVyVHlwZXM9Y29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkKCkgKT8gKCBjb2xvbj08Q09MT04+IGluc3RDbGFzc05hbWU9Ym91bmRFeGNlcHRXaWxkY2FyZCgpICk/IGxjdXJseT08TENVUkxZPiBjbGFzc01lbWJlckRlY2xzPWNsYXNzTWVtYmVyRGVjbHMoKSByY3VybHk9PFJDVVJMWT4gCisgIHsgcmV0VmFsID0gbmV3IENsYXNzRGVjbChhbm5vdGF0aW9ucywgYWJzdHJhY3RNb2RpZmllciwgY2xhc3NLaW5kLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIHR5cGVQYXJhbXNJbmZvLCBjcmVhdGVUb2tlbkluZm8oZXh0ZW5kc19LVyksIHN1cGVyVHlwZXMsIGNyZWF0ZVRva2VuSW5mbyhjb2xvbiksIGluc3RDbGFzc05hbWUsIGNyZWF0ZVRva2VuSW5mbyhsY3VybHkpLCBjbGFzc01lbWJlckRlY2xzLCBjcmVhdGVUb2tlbkluZm8ocmN1cmx5KSk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQgY29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkKCkgOgoreyBDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQgcmV0VmFsID0gbmV3IENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCgpOworICBCb3VuZEV4Y2VwdFdpbGRjYXJkIHRiMSA9IG51bGw7CisgIFRva2VuIGNvbW1hID0gbnVsbDsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCB0Ym4gPSBudWxsOyB9Cit7ICggdGIxPWJvdW5kRXhjZXB0V2lsZGNhcmQoKSB7IHJldFZhbC5hZGRDaGlsZCh0YjEpOyB9ICkKKyAgKCBjb21tYT08Q09NTUE+IHRibj1ib3VuZEV4Y2VwdFdpbGRjYXJkKCkgeyByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGNvbW1hKSk7IHJldFZhbC5hZGRDaGlsZCh0Ym4pOyB9ICkqIHsgcmV0dXJuIHJldFZhbDsgfSB9CisKK0Fic3RyYWN0TW9kaWZpZXIgYWJzdHJhY3RNb2RpZmllcigpIDoKK3sgQWJzdHJhY3RNb2RpZmllciByZXRWYWwgPSBudWxsOworICBUb2tlbiBhYnN0cmFjdF9LVyA9IG51bGw7IH0KK3sKK2Fic3RyYWN0X0tXPTxBQlNUUkFDVEtXPiAKKyAgeyByZXRWYWwgPSBuZXcgQWJzdHJhY3RNb2RpZmllcihjcmVhdGVUb2tlbkluZm8oYWJzdHJhY3RfS1cpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK0NsYXNzS2luZCBjbGFzc0tpbmQoKSA6Cit7IFRva2VuIHRvazsgfQoreyB0b2s9PENMQVNTS1c+IHsgcmV0dXJuIG5ldyBDbGFzc0tpbmQgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PElOVEVSRkFDRUtXPiB7IHJldHVybiBuZXcgQ2xhc3NLaW5kIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK30KKworVHlwZVBhcmFtc0luZm8gdHlwZVBhcmFtc0luZm8oKSA6Cit7IFR5cGVQYXJhbXNJbmZvIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGx0ID0gbnVsbDsKKyAgT25lT3JNb3JlVHlwZVBhcmFtcyBvbmVPck1vcmVUeXBlUGFyYW1zID0gbnVsbDsKKyAgVG9rZW4gZ3QgPSBudWxsOyB9Cit7CitsdD08TFQ+IG9uZU9yTW9yZVR5cGVQYXJhbXM9b25lT3JNb3JlVHlwZVBhcmFtcygpIGd0PTxHVD4gCisgIHsgcmV0VmFsID0gbmV3IFR5cGVQYXJhbXNJbmZvKGNyZWF0ZVRva2VuSW5mbyhsdCksIG9uZU9yTW9yZVR5cGVQYXJhbXMsIGNyZWF0ZVRva2VuSW5mbyhndCkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworT25lT3JNb3JlVHlwZVBhcmFtcyBvbmVPck1vcmVUeXBlUGFyYW1zKCkgOgoreyBPbmVPck1vcmVUeXBlUGFyYW1zIHJldFZhbCA9IG5ldyBPbmVPck1vcmVUeXBlUGFyYW1zKCk7CisgIFR5cGVQYXJhbSB0cDEgPSBudWxsOworICBUb2tlbiBjb21tYSA9IG51bGw7CisgIFR5cGVQYXJhbSB0cG4gPSBudWxsOyB9Cit7ICggdHAxPXR5cGVQYXJhbSgpIHsgcmV0VmFsLmFkZENoaWxkKHRwMSk7IH0gKQorICAoIGNvbW1hPTxDT01NQT4gdHBuPXR5cGVQYXJhbSgpIHsgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhjb21tYSkpOyByZXRWYWwuYWRkQ2hpbGQodHBuKTsgfSApKiB7IHJldHVybiByZXRWYWw7IH0gfQorCitUeXBlUGFyYW0gdHlwZVBhcmFtKCkgOgoreyBUeXBlUGFyYW0gcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gdHlwZVZhck5hbWUgPSBudWxsOworICBUeXBlQm91bmRzSW5mbyB0eXBlQm91bmRzSW5mbyA9IG51bGw7IH0KK3sKK3R5cGVWYXJOYW1lPTxJRD4gKCB0eXBlQm91bmRzSW5mbz10eXBlQm91bmRzSW5mbygpICk/IAorICB7IHJldFZhbCA9IG5ldyBUeXBlUGFyYW0oY3JlYXRlVG9rZW5JbmZvKHR5cGVWYXJOYW1lKSwgdHlwZUJvdW5kc0luZm8pOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworVHlwZUJvdW5kc0luZm8gdHlwZUJvdW5kc0luZm8oKSA6Cit7IFR5cGVCb3VuZHNJbmZvIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGV4dGVuZHNfS1cgPSBudWxsOworICBPbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMgb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzID0gbnVsbDsgfQoreworZXh0ZW5kc19LVz08RVhURU5EU0tXPiBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHM9b25lT3JNb3JlVHlwZVBhcmFtQm91bmRzKCkgCisgIHsgcmV0VmFsID0gbmV3IFR5cGVCb3VuZHNJbmZvKGNyZWF0ZVRva2VuSW5mbyhleHRlbmRzX0tXKSwgb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK09uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMoKSA6Cit7IE9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyByZXRWYWwgPSBuZXcgT25lT3JNb3JlVHlwZVBhcmFtQm91bmRzKCk7CisgIEJvdW5kRXhjZXB0V2lsZGNhcmQgdGIxID0gbnVsbDsKKyAgVG9rZW4gYW1wID0gbnVsbDsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCB0Ym4gPSBudWxsOyB9Cit7ICggdGIxPWJvdW5kRXhjZXB0V2lsZGNhcmQoKSB7IHJldFZhbC5hZGRDaGlsZCh0YjEpOyB9ICkKKyAgKCBhbXA9PEFNUD4gdGJuPWJvdW5kRXhjZXB0V2lsZGNhcmQoKSB7IHJldFZhbC5hZGRDaGlsZChjcmVhdGVUb2tlbkluZm8oYW1wKSk7IHJldFZhbC5hZGRDaGlsZCh0Ym4pOyB9ICkqIHsgcmV0dXJuIHJldFZhbDsgfSB9CisKK0JvdW5kRXhjZXB0V2lsZGNhcmQgYm91bmRFeGNlcHRXaWxkY2FyZCgpIDoKK3sgQm91bmRFeGNlcHRXaWxkY2FyZCByZXRWYWwgPSBudWxsOworICBRdWFsaWZpZWRJRCByYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSA9IG51bGw7CisgIFRva2VuIGx0ID0gbnVsbDsKKyAgT25lT3JNb3JlVHlwZUFyZ3Mgb25lT3JNb3JlVHlwZUFyZ3MgPSBudWxsOworICBUb2tlbiBndCA9IG51bGw7IH0KK3sKK3Jhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lPXF1YWxpZmllZElEKCkgKCBsdD08TFQ+IG9uZU9yTW9yZVR5cGVBcmdzPW9uZU9yTW9yZVR5cGVBcmdzKCkgZ3Q9PEdUPiApPyAKKyAgeyByZXRWYWwgPSBuZXcgQm91bmRFeGNlcHRXaWxkY2FyZChyYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSwgY3JlYXRlVG9rZW5JbmZvKGx0KSwgb25lT3JNb3JlVHlwZUFyZ3MsIGNyZWF0ZVRva2VuSW5mbyhndCkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworT25lT3JNb3JlVHlwZUFyZ3Mgb25lT3JNb3JlVHlwZUFyZ3MoKSA6Cit7IE9uZU9yTW9yZVR5cGVBcmdzIHJldFZhbCA9IG5ldyBPbmVPck1vcmVUeXBlQXJncygpOworICBUeXBlQXJnIHRhMSA9IG51bGw7CisgIFRva2VuIGNvbW1hID0gbnVsbDsKKyAgVHlwZUFyZyB0YW4gPSBudWxsOyB9Cit7ICggdGExPXR5cGVBcmcoKSB7IHJldFZhbC5hZGRDaGlsZCh0YTEpOyB9ICkKKyAgKCBjb21tYT08Q09NTUE+IHRhbj10eXBlQXJnKCkgeyByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGNvbW1hKSk7IHJldFZhbC5hZGRDaGlsZCh0YW4pOyB9ICkqIHsgcmV0dXJuIHJldFZhbDsgfSB9CisKK1R5cGVBcmcgdHlwZUFyZygpIDoKK3sgVHlwZUFyZyByZXRWYWwgPSBudWxsOyB9Cit7CisgICggcmV0VmFsPWJvdW5kRXhjZXB0V2lsZGNhcmQoKSB7IHJldHVybiByZXRWYWw7IH0KKyAgfCByZXRWYWw9d2lsZGNhcmQoKSB7IHJldHVybiByZXRWYWw7IH0KKyAgKQorfQorCitXaWxkY2FyZCB3aWxkY2FyZCgpIDoKK3sgV2lsZGNhcmQgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gcW1hcmsgPSBudWxsOworICBFeHRlbmRzT3JTdXBlciBleHRlbmRzT3JTdXBlciA9IG51bGw7CisgIEJvdW5kRXhjZXB0V2lsZGNhcmQgYm91bmRFeGNlcHRXaWxkY2FyZCA9IG51bGw7IH0KK3sKK3FtYXJrPTxRTUFSSz4gKCBleHRlbmRzT3JTdXBlcj1leHRlbmRzT3JTdXBlcigpIGJvdW5kRXhjZXB0V2lsZGNhcmQ9Ym91bmRFeGNlcHRXaWxkY2FyZCgpICk/IAorICB7IHJldFZhbCA9IG5ldyBXaWxkY2FyZChjcmVhdGVUb2tlbkluZm8ocW1hcmspLCBleHRlbmRzT3JTdXBlciwgYm91bmRFeGNlcHRXaWxkY2FyZCk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitFeHRlbmRzT3JTdXBlciBleHRlbmRzT3JTdXBlcigpIDoKK3sgVG9rZW4gdG9rOyB9Cit7IHRvaz08RVhURU5EU0tXPiB7IHJldHVybiBuZXcgRXh0ZW5kc09yU3VwZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PFNVUEVSS1c+IHsgcmV0dXJuIG5ldyBFeHRlbmRzT3JTdXBlciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit9CisKK0NsYXNzTWVtYmVyRGVjbHMgY2xhc3NNZW1iZXJEZWNscygpIDoKK3sgQ2xhc3NNZW1iZXJEZWNscyByZXRWYWwgPSBuZXcgQ2xhc3NNZW1iZXJEZWNscygpOworICBDbGFzc01lbWJlckRlY2wgY2xhc3NNZW1iZXJEZWNsID0gbnVsbDsgfQoreyAoIGNsYXNzTWVtYmVyRGVjbD1jbGFzc01lbWJlckRlY2woKSB7IHJldFZhbC5hZGRDaGlsZChjbGFzc01lbWJlckRlY2wpOyB9ICkqIHsgcmV0dXJuIHJldFZhbDsgfSB9CisKK0NsYXNzTWVtYmVyRGVjbCBjbGFzc01lbWJlckRlY2woKSA6Cit7IENsYXNzTWVtYmVyRGVjbCByZXRWYWwgPSBudWxsOworICBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyA9IG51bGw7CisgIE1vZGlmaWVycyBtb2RpZmllcnMgPSBudWxsOyB9Cit7Cithbm5vdGF0aW9ucz1hbm5vdGF0aW9ucygpIG1vZGlmaWVycz1tb2RpZmllcnMoKSAKKyAgKCByZXRWYWw9YXR0cmlidXRlKGFubm90YXRpb25zLCBtb2RpZmllcnMpIHsgcmV0dXJuIHJldFZhbDsgfQorICB8IHJldFZhbD1yZWZlcmVuY2UoYW5ub3RhdGlvbnMsIG1vZGlmaWVycykgeyByZXR1cm4gcmV0VmFsOyB9CisgIHwgcmV0VmFsPW9wZXJhdGlvbihhbm5vdGF0aW9ucywgbW9kaWZpZXJzKSB7IHJldHVybiByZXRWYWw7IH0KKyAgKQorfQorCitBdHRyaWJ1dGUgYXR0cmlidXRlKEFubm90YXRpb25zIGFubm90YXRpb25zLCBNb2RpZmllcnMgbW9kaWZpZXJzKSA6Cit7IEF0dHJpYnV0ZSByZXRWYWwgPSBudWxsOworICBUb2tlbiBhdHRyX0tXID0gbnVsbDsKKyAgVHlwZVdpdGhNdWx0aSB0eXBlV2l0aE11bHRpID0gbnVsbDsKKyAgVG9rZW4gbmFtZSA9IG51bGw7CisgIFRva2VuIGVxdWFscyA9IG51bGw7CisgIERlZmF1bHRWYWx1ZUV4cHIgZGVmYXVsdFZhbHVlRXhwciA9IG51bGw7CisgIFRva2VuIHNlbWkgPSBudWxsOyB9Cit7CithdHRyX0tXPTxBVFRSS1c+IHR5cGVXaXRoTXVsdGk9dHlwZVdpdGhNdWx0aSgpIG5hbWU9PElEPiAoIGVxdWFscz08RVFVQUxTPiBkZWZhdWx0VmFsdWVFeHByPWRlZmF1bHRWYWx1ZUV4cHIoKSApPyBzZW1pPTxTRU1JPiAKKyAgeyByZXRWYWwgPSBuZXcgQXR0cmlidXRlKGFubm90YXRpb25zLCBtb2RpZmllcnMsIGNyZWF0ZVRva2VuSW5mbyhhdHRyX0tXKSwgdHlwZVdpdGhNdWx0aSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgZGVmYXVsdFZhbHVlRXhwciwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK1R5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSgpIDoKK3sgVHlwZVdpdGhNdWx0aSByZXRWYWwgPSBudWxsOworICBCb3VuZEV4Y2VwdFdpbGRjYXJkIG5hbWUgPSBudWxsOworICBNdWx0aXBsaWNpdHkgbXVsdGlwbGljaXR5ID0gbnVsbDsgfQoreworbmFtZT1ib3VuZEV4Y2VwdFdpbGRjYXJkKCkgKCBtdWx0aXBsaWNpdHk9bXVsdGlwbGljaXR5KCkgKT8gCisgIHsgcmV0VmFsID0gbmV3IFR5cGVXaXRoTXVsdGkobmFtZSwgbXVsdGlwbGljaXR5KTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK011bHRpcGxpY2l0eSBtdWx0aXBsaWNpdHkoKSA6Cit7IE11bHRpcGxpY2l0eSByZXRWYWwgPSBudWxsOworICBUb2tlbiBsc3F1YXJlID0gbnVsbDsKKyAgTXVsdGlwbGljaXR5RXhwciBtdWx0aXBsaWNpdHlFeHByID0gbnVsbDsKKyAgVG9rZW4gcnNxdWFyZSA9IG51bGw7IH0KK3sKK2xzcXVhcmU9PExTUVVBUkU+ICggbXVsdGlwbGljaXR5RXhwcj1tdWx0aXBsaWNpdHlFeHByKCkgKT8gcnNxdWFyZT08UlNRVUFSRT4gCisgIHsgcmV0VmFsID0gbmV3IE11bHRpcGxpY2l0eShjcmVhdGVUb2tlbkluZm8obHNxdWFyZSksIG11bHRpcGxpY2l0eUV4cHIsIGNyZWF0ZVRva2VuSW5mbyhyc3F1YXJlKSk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitNdWx0aXBsaWNpdHlFeHByIG11bHRpcGxpY2l0eUV4cHIoKSA6Cit7IE11bHRpcGxpY2l0eUV4cHIgcmV0VmFsID0gbnVsbDsKKyAgU2ltcGxlTXVsdGlwbGljaXR5RXhwciBsb3dlckJvdW5kID0gbnVsbDsKKyAgVG9rZW4gZG90X2RvdCA9IG51bGw7CisgIFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgdXBwZXJCb3VuZCA9IG51bGw7IH0KK3sKK2xvd2VyQm91bmQ9c2ltcGxlTXVsdGlwbGljaXR5RXhwcigpICggZG90X2RvdD08RE9UX0RPVD4gdXBwZXJCb3VuZD1zaW1wbGVNdWx0aXBsaWNpdHlFeHByKCkgKT8gCisgIHsgcmV0VmFsID0gbmV3IE11bHRpcGxpY2l0eUV4cHIobG93ZXJCb3VuZCwgY3JlYXRlVG9rZW5JbmZvKGRvdF9kb3QpLCB1cHBlckJvdW5kKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK1NpbXBsZU11bHRpcGxpY2l0eUV4cHIgc2ltcGxlTXVsdGlwbGljaXR5RXhwcigpIDoKK3sgVG9rZW4gdG9rOyB9Cit7IHRvaz08U1RBUj4geyByZXR1cm4gbmV3IFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PFBMVVM+IHsgcmV0dXJuIG5ldyBTaW1wbGVNdWx0aXBsaWNpdHlFeHByIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK3wgdG9rPTxRTUFSSz4geyByZXR1cm4gbmV3IFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PElOVF9MSVRFUkFMPiB7IHJldHVybiBuZXcgU2ltcGxlTXVsdGlwbGljaXR5RXhwciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit9CisKK1JlZmVyZW5jZSByZWZlcmVuY2UoQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMsIE1vZGlmaWVycyBtb2RpZmllcnMpIDoKK3sgUmVmZXJlbmNlIHJldFZhbCA9IG51bGw7CisgIFJlZmVyZW5jZUtpbmQgcmVmZXJlbmNlS2luZCA9IG51bGw7CisgIFR5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSA9IG51bGw7CisgIFRva2VuIGhhc2ggPSBudWxsOworICBUb2tlbiBvcHBvc2l0ZU5hbWUgPSBudWxsOworICBUb2tlbiBuYW1lID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7IH0KK3sKK3JlZmVyZW5jZUtpbmQ9cmVmZXJlbmNlS2luZCgpIHR5cGVXaXRoTXVsdGk9dHlwZVdpdGhNdWx0aSgpICggaGFzaD08SEFTSD4gb3Bwb3NpdGVOYW1lPTxJRD4gKT8gbmFtZT08SUQ+IHNlbWk9PFNFTUk+IAorICB7IHJldFZhbCA9IG5ldyBSZWZlcmVuY2UoYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgcmVmZXJlbmNlS2luZCwgdHlwZVdpdGhNdWx0aSwgY3JlYXRlVG9rZW5JbmZvKGhhc2gpLCBjcmVhdGVUb2tlbkluZm8ob3Bwb3NpdGVOYW1lKSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oc2VtaSkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworUmVmZXJlbmNlS2luZCByZWZlcmVuY2VLaW5kKCkgOgoreyBUb2tlbiB0b2s7IH0KK3sgdG9rPTxSRUZLVz4geyByZXR1cm4gbmV3IFJlZmVyZW5jZUtpbmQgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PFZBTEtXPiB7IHJldHVybiBuZXcgUmVmZXJlbmNlS2luZCAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit9CisKK01vZGlmaWVycyBtb2RpZmllcnMoKSA6Cit7IE1vZGlmaWVycyByZXRWYWwgPSBuZXcgTW9kaWZpZXJzKCk7CisgIE9wdE5lZ2F0ZWRNb2RpZmllciBvcHROZWdhdGVkTW9kaWZpZXIgPSBudWxsOyB9Cit7ICggb3B0TmVnYXRlZE1vZGlmaWVyPW9wdE5lZ2F0ZWRNb2RpZmllcigpIHsgcmV0VmFsLmFkZENoaWxkKG9wdE5lZ2F0ZWRNb2RpZmllcik7IH0gKSogeyByZXR1cm4gcmV0VmFsOyB9IH0KKworT3B0TmVnYXRlZE1vZGlmaWVyIG9wdE5lZ2F0ZWRNb2RpZmllcigpIDoKK3sgT3B0TmVnYXRlZE1vZGlmaWVyIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGJhbmcgPSBudWxsOworICBNb2RpZmllciBtb2RpZmllciA9IG51bGw7IH0KK3sKKyggYmFuZz08QkFORz4gKT8gbW9kaWZpZXI9bW9kaWZpZXIoKSAKKyAgeyByZXRWYWwgPSBuZXcgT3B0TmVnYXRlZE1vZGlmaWVyKGNyZWF0ZVRva2VuSW5mbyhiYW5nKSwgbW9kaWZpZXIpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworTW9kaWZpZXIgbW9kaWZpZXIoKSA6Cit7IFRva2VuIHRvazsgfQoreyB0b2s9PFJFQURPTkxZS1c+IHsgcmV0dXJuIG5ldyBNb2RpZmllciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit8IHRvaz08Vk9MQVRJTEVLVz4geyByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK3wgdG9rPTxUUkFOU0lFTlRLVz4geyByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK3wgdG9rPTxVTlNFVFRBQkxFS1c+IHsgcmV0dXJuIG5ldyBNb2RpZmllciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit8IHRvaz08REVSSVZFREtXPiB7IHJldHVybiBuZXcgTW9kaWZpZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PFVOSVFVRUtXPiB7IHJldHVybiBuZXcgTW9kaWZpZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PE9SREVSRURLVz4geyByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK3wgdG9rPTxSRVNPTFZFS1c+IHsgcmV0dXJuIG5ldyBNb2RpZmllciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit8IHRvaz08SURLVz4geyByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK30KKworRGVmYXVsdFZhbHVlRXhwciBkZWZhdWx0VmFsdWVFeHByKCkgOgoreyBEZWZhdWx0VmFsdWVFeHByIHJldFZhbCA9IG51bGw7IH0KK3sKKyAgKCByZXRWYWw9Ym9vbEV4cHIoKSB7IHJldHVybiByZXRWYWw7IH0KKyAgfCByZXRWYWw9aW50RXhwcigpIHsgcmV0dXJuIHJldFZhbDsgfQorICB8IHJldFZhbD1zdHJpbmdFeHByKCkgeyByZXR1cm4gcmV0VmFsOyB9CisgIHwgcmV0VmFsPWNoYXJFeHByKCkgeyByZXR1cm4gcmV0VmFsOyB9CisgICkKK30KKworQm9vbEV4cHIgYm9vbEV4cHIoKSA6Cit7IEJvb2xFeHByIHJldFZhbCA9IG51bGw7CisgIFRydWVPckZhbHNlIHRydWVPckZhbHNlID0gbnVsbDsgfQorewordHJ1ZU9yRmFsc2U9dHJ1ZU9yRmFsc2UoKSAKKyAgeyByZXRWYWwgPSBuZXcgQm9vbEV4cHIodHJ1ZU9yRmFsc2UpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworVHJ1ZU9yRmFsc2UgdHJ1ZU9yRmFsc2UoKSA6Cit7IFRva2VuIHRvazsgfQoreyB0b2s9PFRSVUVLVz4geyByZXR1cm4gbmV3IFRydWVPckZhbHNlIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK3wgdG9rPTxGQUxTRUtXPiB7IHJldHVybiBuZXcgVHJ1ZU9yRmFsc2UgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfQorCitJbnRFeHByIGludEV4cHIoKSA6Cit7IEludEV4cHIgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gbWludXMgPSBudWxsOworICBUb2tlbiBpbnRfbGl0ZXJhbCA9IG51bGw7IH0KK3sKKyggbWludXM9PE1JTlVTPiApPyBpbnRfbGl0ZXJhbD08SU5UX0xJVEVSQUw+IAorICB7IHJldFZhbCA9IG5ldyBJbnRFeHByKGNyZWF0ZVRva2VuSW5mbyhtaW51cyksIGNyZWF0ZVRva2VuSW5mbyhpbnRfbGl0ZXJhbCkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworU3RyaW5nRXhwciBzdHJpbmdFeHByKCkgOgoreyBTdHJpbmdFeHByIHJldFZhbCA9IG51bGw7CisgIFRva2VuIHN0cmluZ19saXRlcmFsID0gbnVsbDsgfQoreworc3RyaW5nX2xpdGVyYWw9PFNUUklOR19MSVRFUkFMPiAKKyAgeyByZXRWYWwgPSBuZXcgU3RyaW5nRXhwcihjcmVhdGVUb2tlbkluZm8oc3RyaW5nX2xpdGVyYWwpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK0NoYXJFeHByIGNoYXJFeHByKCkgOgoreyBDaGFyRXhwciByZXRWYWwgPSBudWxsOworICBUb2tlbiBjaGFyX2xpdGVyYWwgPSBudWxsOyB9Cit7CitjaGFyX2xpdGVyYWw9PENIQVJfTElURVJBTD4gCisgIHsgcmV0VmFsID0gbmV3IENoYXJFeHByKGNyZWF0ZVRva2VuSW5mbyhjaGFyX2xpdGVyYWwpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK09wZXJhdGlvbiBvcGVyYXRpb24oQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMsIE1vZGlmaWVycyBtb2RpZmllcnMpIDoKK3sgT3BlcmF0aW9uIHJldFZhbCA9IG51bGw7CisgIFRva2VuIG9wX0tXID0gbnVsbDsKKyAgVHlwZVBhcmFtc0luZm8gdHlwZVBhcmFtc0luZm8gPSBudWxsOworICBSZXN1bHRUeXBlIHJlc1R5cGUgPSBudWxsOworICBUb2tlbiBuYW1lID0gbnVsbDsKKyAgVG9rZW4gbHBhcmVuID0gbnVsbDsKKyAgUGFyYW1zIHBhcmFtcyA9IG51bGw7CisgIFRva2VuIHJwYXJlbiA9IG51bGw7CisgIFRva2VuIHRocm93c19LVyA9IG51bGw7CisgIENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBleGNlcHRpb25zID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7IH0KK3sKK29wX0tXPTxPUEtXPiAoIHR5cGVQYXJhbXNJbmZvPXR5cGVQYXJhbXNJbmZvKCkgKT8gcmVzVHlwZT1yZXN1bHRUeXBlKCkgbmFtZT08SUQ+IGxwYXJlbj08TFBBUkVOPiAoIHBhcmFtcz1wYXJhbXMoKSApPyBycGFyZW49PFJQQVJFTj4gKCB0aHJvd3NfS1c9PFRIUk9XU0tXPiBleGNlcHRpb25zPWNvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCgpICk/IHNlbWk9PFNFTUk+IAorICB7IHJldFZhbCA9IG5ldyBPcGVyYXRpb24oYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgY3JlYXRlVG9rZW5JbmZvKG9wX0tXKSwgdHlwZVBhcmFtc0luZm8sIHJlc1R5cGUsIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGxwYXJlbiksIHBhcmFtcywgY3JlYXRlVG9rZW5JbmZvKHJwYXJlbiksIGNyZWF0ZVRva2VuSW5mbyh0aHJvd3NfS1cpLCBleGNlcHRpb25zLCBjcmVhdGVUb2tlbkluZm8oc2VtaSkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworUmVzdWx0VHlwZSByZXN1bHRUeXBlKCkgOgoreyBSZXN1bHRUeXBlIHJldFZhbCA9IG51bGw7IH0KK3sKKyAgKCByZXRWYWw9dHlwZVdpdGhNdWx0aSgpIHsgcmV0dXJuIHJldFZhbDsgfQorICB8IHJldFZhbD12b2lkQ29udGFpbmVyKCkgeyByZXR1cm4gcmV0VmFsOyB9CisgICkKK30KKworVm9pZENvbnRhaW5lciB2b2lkQ29udGFpbmVyKCkgOgoreyBWb2lkQ29udGFpbmVyIHJldFZhbCA9IG51bGw7CisgIFRva2VuIHZvaWRfS1cgPSBudWxsOyB9Cit7Cit2b2lkX0tXPTxWT0lES1c+IAorICB7IHJldFZhbCA9IG5ldyBWb2lkQ29udGFpbmVyKGNyZWF0ZVRva2VuSW5mbyh2b2lkX0tXKSk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitQYXJhbXMgcGFyYW1zKCkgOgoreyBQYXJhbXMgcmV0VmFsID0gbmV3IFBhcmFtcygpOworICBQYXJhbSBwMSA9IG51bGw7CisgIFRva2VuIGNvbW1hID0gbnVsbDsKKyAgUGFyYW0gcG4gPSBudWxsOyB9Cit7ICggcDE9cGFyYW0oKSB7IHJldFZhbC5hZGRDaGlsZChwMSk7IH0gKQorICAoIGNvbW1hPTxDT01NQT4gcG49cGFyYW0oKSB7IHJldFZhbC5hZGRDaGlsZChjcmVhdGVUb2tlbkluZm8oY29tbWEpKTsgcmV0VmFsLmFkZENoaWxkKHBuKTsgfSApKiB7IHJldHVybiByZXRWYWw7IH0gfQorCitQYXJhbSBwYXJhbSgpIDoKK3sgUGFyYW0gcmV0VmFsID0gbnVsbDsKKyAgQW5ub3RhdGlvbnMgbGVhZGluZ0Fubm90YXRpb25zID0gbnVsbDsKKyAgTW9kaWZpZXJzIG1vZGlmaWVycyA9IG51bGw7CisgIFR5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBBbm5vdGF0aW9ucyB0cmFpbGluZ0Fubm90YXRpb25zID0gbnVsbDsgfQoreworbGVhZGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zKCkgbW9kaWZpZXJzPW1vZGlmaWVycygpIHR5cGVXaXRoTXVsdGk9dHlwZVdpdGhNdWx0aSgpIG5hbWU9PElEPiB0cmFpbGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zKCkgCisgIHsgcmV0VmFsID0gbmV3IFBhcmFtKGxlYWRpbmdBbm5vdGF0aW9ucywgbW9kaWZpZXJzLCB0eXBlV2l0aE11bHRpLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIHRyYWlsaW5nQW5ub3RhdGlvbnMpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworRGF0YVR5cGVEZWNsIGRhdGFUeXBlRGVjbChBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucykgOgoreyBEYXRhVHlwZURlY2wgcmV0VmFsID0gbnVsbDsKKyAgVHJhbnNpZW50TW9kaWZpZXIgdHJhbnNpZW50TW9kaWZpZXIgPSBudWxsOworICBUb2tlbiBkYXRhdHlwZV9LVyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBjb2xvbiA9IG51bGw7CisgIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIGluc3RDbGFzc05hbWUgPSBudWxsOworICBUb2tlbiBzZW1pID0gbnVsbDsgfQoreworKCB0cmFuc2llbnRNb2RpZmllcj10cmFuc2llbnRNb2RpZmllcigpICk/IGRhdGF0eXBlX0tXPTxEQVRBVFlQRUtXPiBuYW1lPTxJRD4gY29sb249PENPTE9OPiBpbnN0Q2xhc3NOYW1lPXN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKCkgc2VtaT08U0VNST4gCisgIHsgcmV0VmFsID0gbmV3IERhdGFUeXBlRGVjbChhbm5vdGF0aW9ucywgdHJhbnNpZW50TW9kaWZpZXIsIGNyZWF0ZVRva2VuSW5mbyhkYXRhdHlwZV9LVyksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGNvbG9uKSwgaW5zdENsYXNzTmFtZSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK1RyYW5zaWVudE1vZGlmaWVyIHRyYW5zaWVudE1vZGlmaWVyKCkgOgoreyBUcmFuc2llbnRNb2RpZmllciByZXRWYWwgPSBudWxsOworICBUb2tlbiB0cmFuc2llbnRfS1cgPSBudWxsOyB9Cit7Cit0cmFuc2llbnRfS1c9PFRSQU5TSUVOVEtXPiAKKyAgeyByZXRWYWwgPSBuZXcgVHJhbnNpZW50TW9kaWZpZXIoY3JlYXRlVG9rZW5JbmZvKHRyYW5zaWVudF9LVykpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworRW51bURlY2wgZW51bURlY2woQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMpIDoKK3sgRW51bURlY2wgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gZW51bV9LVyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBsY3VybHkgPSBudWxsOworICBFbnVtTGl0ZXJhbHMgZW51bUxpdGVyYWxzID0gbnVsbDsKKyAgVG9rZW4gcmN1cmx5ID0gbnVsbDsgfQoreworZW51bV9LVz08RU5VTUtXPiBuYW1lPTxJRD4gbGN1cmx5PTxMQ1VSTFk+IGVudW1MaXRlcmFscz1lbnVtTGl0ZXJhbHMoKSByY3VybHk9PFJDVVJMWT4gCisgIHsgcmV0VmFsID0gbmV3IEVudW1EZWNsKGFubm90YXRpb25zLCBjcmVhdGVUb2tlbkluZm8oZW51bV9LVyksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGxjdXJseSksIGVudW1MaXRlcmFscywgY3JlYXRlVG9rZW5JbmZvKHJjdXJseSkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworRW51bUxpdGVyYWxzIGVudW1MaXRlcmFscygpIDoKK3sgRW51bUxpdGVyYWxzIHJldFZhbCA9IG5ldyBFbnVtTGl0ZXJhbHMoKTsKKyAgRW51bUxpdGVyYWwgZW51bUxpdGVyYWwgPSBudWxsOyB9Cit7ICggZW51bUxpdGVyYWw9ZW51bUxpdGVyYWwoKSB7IHJldFZhbC5hZGRDaGlsZChlbnVtTGl0ZXJhbCk7IH0gKSogeyByZXR1cm4gcmV0VmFsOyB9IH0KKworRW51bUxpdGVyYWwgZW51bUxpdGVyYWwoKSA6Cit7IEVudW1MaXRlcmFsIHJldFZhbCA9IG51bGw7CisgIEFubm90YXRpb25zIGxlYWRpbmdBbm5vdGF0aW9ucyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBlcXVhbHMgPSBudWxsOworICBUb2tlbiB2YWwgPSBudWxsOworICBBbm5vdGF0aW9ucyB0cmFpbGluZ0Fubm90YXRpb25zID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7IH0KK3sKK2xlYWRpbmdBbm5vdGF0aW9ucz1hbm5vdGF0aW9ucygpIG5hbWU9PElEPiAoIGVxdWFscz08RVFVQUxTPiB2YWw9PElOVF9MSVRFUkFMPiApPyB0cmFpbGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zKCkgc2VtaT08U0VNST4gCisgIHsgcmV0VmFsID0gbmV3IEVudW1MaXRlcmFsKGxlYWRpbmdBbm5vdGF0aW9ucywgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgY3JlYXRlVG9rZW5JbmZvKHZhbCksIHRyYWlsaW5nQW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitNYXBFbnRyeURlY2wgbWFwRW50cnlEZWNsKEFubm90YXRpb25zIGFubm90YXRpb25zKSA6Cit7IE1hcEVudHJ5RGVjbCByZXRWYWwgPSBudWxsOworICBUb2tlbiBtYXBlbnRyeV9LVyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBjb2xvbiA9IG51bGw7CisgIFR5cGVXaXRoTXVsdGkga2V5ID0gbnVsbDsKKyAgVG9rZW4gbWludXNfZ3QgPSBudWxsOworICBUeXBlV2l0aE11bHRpIHZhbHVlID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7IH0KK3sKK21hcGVudHJ5X0tXPTxNQVBFTlRSWUtXPiBuYW1lPTxJRD4gY29sb249PENPTE9OPiBrZXk9dHlwZVdpdGhNdWx0aSgpIG1pbnVzX2d0PTxNSU5VU19HVD4gdmFsdWU9dHlwZVdpdGhNdWx0aSgpIHNlbWk9PFNFTUk+IAorICB7IHJldFZhbCA9IG5ldyBNYXBFbnRyeURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhtYXBlbnRyeV9LVyksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGNvbG9uKSwga2V5LCBjcmVhdGVUb2tlbkluZm8obWludXNfZ3QpLCB2YWx1ZSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL2phdmFjY1BhcnNlci9FbWZhdGljUGFyc2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvRW1mYXRpY1BhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZjM0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvRW1mYXRpY1BhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjg3MyBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBFbWZhdGljUGFyc2VyLmphdmEgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC4qOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY1BhcnNlciBpbXBsZW1lbnRzIEVtZmF0aWNQYXJzZXJDb25zdGFudHMgeworCisgIHB1YmxpYyBUb2tlbkluZm8gY3JlYXRlVG9rZW5JbmZvKFRva2VuIHRvaykgeworICAgIGlmICghKHRvayBpbnN0YW5jZW9mIEV4dFRva2VuKSkgcmV0dXJuIG51bGw7CisKKyAgICBFeHRUb2tlbiBleHRUb2tlbiA9IChFeHRUb2tlbikgdG9rOworICAgIHJldHVybiBuZXcgVG9rZW5JbmZvKHRvay5pbWFnZSwgZXh0VG9rZW4udG9rZW5PZmZzZXQsIHRvay5raW5kKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBDb21wVW5pdCBjb21wVW5pdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIENvbXBVbml0IHJldFZhbCA9IG51bGw7CisgIFBhY2thZ2VEZWNsIHBhY2thZ2VEZWNsID0gbnVsbDsKKyAgSW1wb3J0U3RtdHMgaW1wb3J0U3RtdHMgPSBudWxsOworICBUb3BMZXZlbERlY2xzIHRvcExldmVsRGVjbHMgPSBudWxsOworICAgIHBhY2thZ2VEZWNsID0gcGFja2FnZURlY2woKTsKKyAgICBpbXBvcnRTdG10cyA9IGltcG9ydFN0bXRzKCk7CisgICAgdG9wTGV2ZWxEZWNscyA9IHRvcExldmVsRGVjbHMoKTsKKyAgICBqal9jb25zdW1lX3Rva2VuKDApOworICAgIHJldFZhbCA9IG5ldyBDb21wVW5pdChwYWNrYWdlRGVjbCwgaW1wb3J0U3RtdHMsIHRvcExldmVsRGVjbHMpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBQYWNrYWdlRGVjbCBwYWNrYWdlRGVjbCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFBhY2thZ2VEZWNsIHJldFZhbCA9IG51bGw7CisgIEFubm90YXRpb25zIGFubm90YXRpb25zID0gbnVsbDsKKyAgVG9rZW4gcGFja2FnZV9LVyA9IG51bGw7CisgIFF1YWxpZmllZElEIG5hbWUgPSBudWxsOworICBUb2tlbiBzZW1pID0gbnVsbDsKKyAgICBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zKCk7CisgICAgcGFja2FnZV9LVyA9IGpqX2NvbnN1bWVfdG9rZW4oUEFDS0FHRUtXKTsKKyAgICBuYW1lID0gcXVhbGlmaWVkSUQoKTsKKyAgICBzZW1pID0gampfY29uc3VtZV90b2tlbihTRU1JKTsKKyAgICByZXRWYWwgPSBuZXcgUGFja2FnZURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhwYWNrYWdlX0tXKSwgbmFtZSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgUXVhbGlmaWVkSUQgcXVhbGlmaWVkSUQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBRdWFsaWZpZWRJRCByZXRWYWwgPSBuZXcgUXVhbGlmaWVkSUQoKTsKKyAgVG9rZW4gaWQxID0gbnVsbDsKKyAgUWlkU2VwYXJhdG9yIHFpZFNlcGFyYXRvciA9IG51bGw7CisgIFRva2VuIGlkbiA9IG51bGw7CisgICAgaWQxID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGlkMSkpOworICAgIGxhYmVsXzE6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChqal8yXzEoNCkpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfMTsKKyAgICAgIH0KKyAgICAgIHFpZFNlcGFyYXRvciA9IHFpZFNlcGFyYXRvcigpOworICAgICAgaWRuID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKHFpZFNlcGFyYXRvcik7IHJldFZhbC5hZGRDaGlsZChjcmVhdGVUb2tlbkluZm8oaWRuKSk7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFFpZFNlcGFyYXRvciBxaWRTZXBhcmF0b3IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUb2tlbiB0b2s7CisgICAgaWYgKGpqXzJfMig0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihET1QpOworICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgUWlkU2VwYXJhdG9yIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSBpZiAoampfMl8zKDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKERPTExBUik7CisgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBRaWRTZXBhcmF0b3IgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgc3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCByZXRWYWwgPSBudWxsOworICAgIGlmIChqal8yXzQoNCkpIHsKKyAgICAgIHJldFZhbCA9IHN0cmluZ0xpdGVyYWxDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNSg0KSkgeworICAgICAgcmV0VmFsID0gcXVhbGlmaWVkSURDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgfSBlbHNlIHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgU3RyaW5nTGl0ZXJhbENvbnRhaW5lciBzdHJpbmdMaXRlcmFsQ29udGFpbmVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgU3RyaW5nTGl0ZXJhbENvbnRhaW5lciByZXRWYWwgPSBudWxsOworICBUb2tlbiBzdHJpbmdfbGl0ZXJhbCA9IG51bGw7CisgICAgc3RyaW5nX2xpdGVyYWwgPSBqal9jb25zdW1lX3Rva2VuKFNUUklOR19MSVRFUkFMKTsKKyAgICByZXRWYWwgPSBuZXcgU3RyaW5nTGl0ZXJhbENvbnRhaW5lcihjcmVhdGVUb2tlbkluZm8oc3RyaW5nX2xpdGVyYWwpKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgUXVhbGlmaWVkSURDb250YWluZXIgcXVhbGlmaWVkSURDb250YWluZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBRdWFsaWZpZWRJRENvbnRhaW5lciByZXRWYWwgPSBudWxsOworICBRdWFsaWZpZWRJRCBxdWFsaWZpZWRJRCA9IG51bGw7CisgICAgcXVhbGlmaWVkSUQgPSBxdWFsaWZpZWRJRCgpOworICAgIHJldFZhbCA9IG5ldyBRdWFsaWZpZWRJRENvbnRhaW5lcihxdWFsaWZpZWRJRCk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEFubm90YXRpb25zIGFubm90YXRpb25zKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgQW5ub3RhdGlvbnMgcmV0VmFsID0gbmV3IEFubm90YXRpb25zKCk7CisgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG51bGw7CisgICAgbGFiZWxfMjoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfNig0KSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF8yOworICAgICAgfQorICAgICAgYW5ub3RhdGlvbiA9IGFubm90YXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5hZGRDaGlsZChhbm5vdGF0aW9uKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgQW5ub3RhdGlvbiByZXRWYWwgPSBudWxsOworICBUb2tlbiBhdCA9IG51bGw7CisgIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHNvdXJjZSA9IG51bGw7CisgIFRva2VuIGxwYXJlbiA9IG51bGw7CisgIEtleUVxdWFsc1ZhbHVlTGlzdCBrZXlFcXVhbHNWYWx1ZUxpc3QgPSBudWxsOworICBUb2tlbiBycGFyZW4gPSBudWxsOworICAgIGF0ID0gampfY29uc3VtZV90b2tlbihBVCk7CisgICAgc291cmNlID0gc3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKTsKKyAgICBscGFyZW4gPSBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7CisgICAga2V5RXF1YWxzVmFsdWVMaXN0ID0ga2V5RXF1YWxzVmFsdWVMaXN0KCk7CisgICAgcnBhcmVuID0gampfY29uc3VtZV90b2tlbihSUEFSRU4pOworICAgIHJldFZhbCA9IG5ldyBBbm5vdGF0aW9uKGNyZWF0ZVRva2VuSW5mbyhhdCksIHNvdXJjZSwgY3JlYXRlVG9rZW5JbmZvKGxwYXJlbiksIGtleUVxdWFsc1ZhbHVlTGlzdCwgY3JlYXRlVG9rZW5JbmZvKHJwYXJlbikpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBLZXlFcXVhbHNWYWx1ZUxpc3Qga2V5RXF1YWxzVmFsdWVMaXN0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgS2V5RXF1YWxzVmFsdWVMaXN0IHJldFZhbCA9IG5ldyBLZXlFcXVhbHNWYWx1ZUxpc3QoKTsKKyAgS2V5RXF1YWxzVmFsdWUga3YxID0gbnVsbDsKKyAgVG9rZW4gY29tbWEgPSBudWxsOworICBLZXlFcXVhbHNWYWx1ZSBrdm4gPSBudWxsOworICAgIGt2MSA9IGtleUVxdWFsc1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQoa3YxKTsKKyAgICBsYWJlbF8zOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoampfMl83KDQpKSB7CisgICAgICAgIDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrIGxhYmVsXzM7CisgICAgICB9CisgICAgICBjb21tYSA9IGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAga3ZuID0ga2V5RXF1YWxzVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhjb21tYSkpOyByZXRWYWwuYWRkQ2hpbGQoa3ZuKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgS2V5RXF1YWxzVmFsdWUga2V5RXF1YWxzVmFsdWUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBLZXlFcXVhbHNWYWx1ZSByZXRWYWwgPSBudWxsOworICBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBrZXkgPSBudWxsOworICBUb2tlbiBlcXVhbHMgPSBudWxsOworICBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCB2YWx1ZSA9IG51bGw7CisgICAga2V5ID0gc3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKTsKKyAgICBlcXVhbHMgPSBqal9jb25zdW1lX3Rva2VuKEVRVUFMUyk7CisgICAgdmFsdWUgPSBzdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCgpOworICAgIHJldFZhbCA9IG5ldyBLZXlFcXVhbHNWYWx1ZShrZXksIGNyZWF0ZVRva2VuSW5mbyhlcXVhbHMpLCB2YWx1ZSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEltcG9ydFN0bXRzIGltcG9ydFN0bXRzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgSW1wb3J0U3RtdHMgcmV0VmFsID0gbmV3IEltcG9ydFN0bXRzKCk7CisgIEltcG9ydFN0bXQgaW1wb3J0U3RtdCA9IG51bGw7CisgICAgbGFiZWxfNDoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfOCg0KSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF80OworICAgICAgfQorICAgICAgaW1wb3J0U3RtdCA9IGltcG9ydFN0bXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5hZGRDaGlsZChpbXBvcnRTdG10KTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgSW1wb3J0U3RtdCBpbXBvcnRTdG10KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgSW1wb3J0U3RtdCByZXRWYWwgPSBudWxsOworICBUb2tlbiBpbXBvcnRfS1cgPSBudWxsOworICBUb2tlbiBhbGlhcyA9IG51bGw7CisgIFRva2VuIGVxdWFscyA9IG51bGw7CisgIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHVyaSA9IG51bGw7CisgIFRva2VuIHNlbWkgPSBudWxsOworICAgIGltcG9ydF9LVyA9IGpqX2NvbnN1bWVfdG9rZW4oSU1QT1JUS1cpOworICAgIGlmIChqal8yXzkoNCkpIHsKKyAgICAgIGFsaWFzID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgICBlcXVhbHMgPSBqal9jb25zdW1lX3Rva2VuKEVRVUFMUyk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgdXJpID0gc3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKTsKKyAgICBzZW1pID0gampfY29uc3VtZV90b2tlbihTRU1JKTsKKyAgICByZXRWYWwgPSBuZXcgSW1wb3J0U3RtdChjcmVhdGVUb2tlbkluZm8oaW1wb3J0X0tXKSwgY3JlYXRlVG9rZW5JbmZvKGFsaWFzKSwgY3JlYXRlVG9rZW5JbmZvKGVxdWFscyksIHVyaSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgVG9wTGV2ZWxEZWNscyB0b3BMZXZlbERlY2xzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgVG9wTGV2ZWxEZWNscyByZXRWYWwgPSBuZXcgVG9wTGV2ZWxEZWNscygpOworICBUb3BMZXZlbERlY2wgdG9wTGV2ZWxEZWNsID0gbnVsbDsKKyAgICBsYWJlbF81OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoampfMl8xMCg0KSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF81OworICAgICAgfQorICAgICAgdG9wTGV2ZWxEZWNsID0gdG9wTGV2ZWxEZWNsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKHRvcExldmVsRGVjbCk7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFRvcExldmVsRGVjbCB0b3BMZXZlbERlY2woKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUb3BMZXZlbERlY2wgcmV0VmFsID0gbnVsbDsKKyAgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgPSBudWxsOworICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMoKTsKKyAgICBpZiAoampfMl8xMSg0KSkgeworICAgICAgcmV0VmFsID0gc3ViUGFja2FnZURlY2woYW5ub3RhdGlvbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIH0gZWxzZSBpZiAoampfMl8xMig0KSkgeworICAgICAgcmV0VmFsID0gY2xhc3NEZWNsKGFubm90YXRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgfSBlbHNlIGlmIChqal8yXzEzKDQpKSB7CisgICAgICByZXRWYWwgPSBkYXRhVHlwZURlY2woYW5ub3RhdGlvbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfMTQoNCkpIHsKKyAgICAgIHJldFZhbCA9IGVudW1EZWNsKGFubm90YXRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfMTUoNCkpIHsKKyAgICAgIHJldFZhbCA9IG1hcEVudHJ5RGVjbChhbm5vdGF0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIH0gZWxzZSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFN1YlBhY2thZ2VEZWNsIHN1YlBhY2thZ2VEZWNsKEFubm90YXRpb25zIGFubm90YXRpb25zKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBTdWJQYWNrYWdlRGVjbCByZXRWYWwgPSBudWxsOworICBUb2tlbiBwYWNrYWdlX0tXID0gbnVsbDsKKyAgVG9rZW4gbmFtZSA9IG51bGw7CisgIFRva2VuIGxjdXJseSA9IG51bGw7CisgIFRvcExldmVsRGVjbHMgdG9wTGV2ZWxEZWNscyA9IG51bGw7CisgIFRva2VuIHJjdXJseSA9IG51bGw7CisgICAgcGFja2FnZV9LVyA9IGpqX2NvbnN1bWVfdG9rZW4oUEFDS0FHRUtXKTsKKyAgICBuYW1lID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgbGN1cmx5ID0gampfY29uc3VtZV90b2tlbihMQ1VSTFkpOworICAgIHRvcExldmVsRGVjbHMgPSB0b3BMZXZlbERlY2xzKCk7CisgICAgcmN1cmx5ID0gampfY29uc3VtZV90b2tlbihSQ1VSTFkpOworICAgIHJldFZhbCA9IG5ldyBTdWJQYWNrYWdlRGVjbChhbm5vdGF0aW9ucywgY3JlYXRlVG9rZW5JbmZvKHBhY2thZ2VfS1cpLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIGNyZWF0ZVRva2VuSW5mbyhsY3VybHkpLCB0b3BMZXZlbERlY2xzLCBjcmVhdGVUb2tlbkluZm8ocmN1cmx5KSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIENsYXNzRGVjbCBjbGFzc0RlY2woQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIENsYXNzRGVjbCByZXRWYWwgPSBudWxsOworICBBYnN0cmFjdE1vZGlmaWVyIGFic3RyYWN0TW9kaWZpZXIgPSBudWxsOworICBDbGFzc0tpbmQgY2xhc3NLaW5kID0gbnVsbDsKKyAgVG9rZW4gbmFtZSA9IG51bGw7CisgIFR5cGVQYXJhbXNJbmZvIHR5cGVQYXJhbXNJbmZvID0gbnVsbDsKKyAgVG9rZW4gZXh0ZW5kc19LVyA9IG51bGw7CisgIENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBzdXBlclR5cGVzID0gbnVsbDsKKyAgVG9rZW4gY29sb24gPSBudWxsOworICBCb3VuZEV4Y2VwdFdpbGRjYXJkIGluc3RDbGFzc05hbWUgPSBudWxsOworICBUb2tlbiBsY3VybHkgPSBudWxsOworICBDbGFzc01lbWJlckRlY2xzIGNsYXNzTWVtYmVyRGVjbHMgPSBudWxsOworICBUb2tlbiByY3VybHkgPSBudWxsOworICAgIGlmIChqal8yXzE2KDQpKSB7CisgICAgICBhYnN0cmFjdE1vZGlmaWVyID0gYWJzdHJhY3RNb2RpZmllcigpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIGNsYXNzS2luZCA9IGNsYXNzS2luZCgpOworICAgIG5hbWUgPSBqal9jb25zdW1lX3Rva2VuKElEKTsKKyAgICBpZiAoampfMl8xNyg0KSkgeworICAgICAgdHlwZVBhcmFtc0luZm8gPSB0eXBlUGFyYW1zSW5mbygpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIGlmIChqal8yXzE4KDQpKSB7CisgICAgICBleHRlbmRzX0tXID0gampfY29uc3VtZV90b2tlbihFWFRFTkRTS1cpOworICAgICAgc3VwZXJUeXBlcyA9IGNvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCgpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIGlmIChqal8yXzE5KDQpKSB7CisgICAgICBjb2xvbiA9IGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOworICAgICAgaW5zdENsYXNzTmFtZSA9IGJvdW5kRXhjZXB0V2lsZGNhcmQoKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICBsY3VybHkgPSBqal9jb25zdW1lX3Rva2VuKExDVVJMWSk7CisgICAgY2xhc3NNZW1iZXJEZWNscyA9IGNsYXNzTWVtYmVyRGVjbHMoKTsKKyAgICByY3VybHkgPSBqal9jb25zdW1lX3Rva2VuKFJDVVJMWSk7CisgICAgcmV0VmFsID0gbmV3IENsYXNzRGVjbChhbm5vdGF0aW9ucywgYWJzdHJhY3RNb2RpZmllciwgY2xhc3NLaW5kLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIHR5cGVQYXJhbXNJbmZvLCBjcmVhdGVUb2tlbkluZm8oZXh0ZW5kc19LVyksIHN1cGVyVHlwZXMsIGNyZWF0ZVRva2VuSW5mbyhjb2xvbiksIGluc3RDbGFzc05hbWUsIGNyZWF0ZVRva2VuSW5mbyhsY3VybHkpLCBjbGFzc01lbWJlckRlY2xzLCBjcmVhdGVUb2tlbkluZm8ocmN1cmx5KSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBjb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQgcmV0VmFsID0gbmV3IENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCgpOworICBCb3VuZEV4Y2VwdFdpbGRjYXJkIHRiMSA9IG51bGw7CisgIFRva2VuIGNvbW1hID0gbnVsbDsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCB0Ym4gPSBudWxsOworICAgIHRiMSA9IGJvdW5kRXhjZXB0V2lsZGNhcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKHRiMSk7CisgICAgbGFiZWxfNjoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfMjAoNCkpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfNjsKKyAgICAgIH0KKyAgICAgIGNvbW1hID0gampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICB0Ym4gPSBib3VuZEV4Y2VwdFdpbGRjYXJkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhjb21tYSkpOyByZXRWYWwuYWRkQ2hpbGQodGJuKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBBYnN0cmFjdE1vZGlmaWVyIGFic3RyYWN0TW9kaWZpZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBBYnN0cmFjdE1vZGlmaWVyIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGFic3RyYWN0X0tXID0gbnVsbDsKKyAgICBhYnN0cmFjdF9LVyA9IGpqX2NvbnN1bWVfdG9rZW4oQUJTVFJBQ1RLVyk7CisgICAgcmV0VmFsID0gbmV3IEFic3RyYWN0TW9kaWZpZXIoY3JlYXRlVG9rZW5JbmZvKGFic3RyYWN0X0tXKSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIENsYXNzS2luZCBjbGFzc0tpbmQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUb2tlbiB0b2s7CisgICAgaWYgKGpqXzJfMjEoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oQ0xBU1NLVyk7CisgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgQ2xhc3NLaW5kIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSBpZiAoampfMl8yMig0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihJTlRFUkZBQ0VLVyk7CisgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IENsYXNzS2luZCAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgeworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUeXBlUGFyYW1zSW5mbyB0eXBlUGFyYW1zSW5mbygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFR5cGVQYXJhbXNJbmZvIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGx0ID0gbnVsbDsKKyAgT25lT3JNb3JlVHlwZVBhcmFtcyBvbmVPck1vcmVUeXBlUGFyYW1zID0gbnVsbDsKKyAgVG9rZW4gZ3QgPSBudWxsOworICAgIGx0ID0gampfY29uc3VtZV90b2tlbihMVCk7CisgICAgb25lT3JNb3JlVHlwZVBhcmFtcyA9IG9uZU9yTW9yZVR5cGVQYXJhbXMoKTsKKyAgICBndCA9IGpqX2NvbnN1bWVfdG9rZW4oR1QpOworICAgIHJldFZhbCA9IG5ldyBUeXBlUGFyYW1zSW5mbyhjcmVhdGVUb2tlbkluZm8obHQpLCBvbmVPck1vcmVUeXBlUGFyYW1zLCBjcmVhdGVUb2tlbkluZm8oZ3QpKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgT25lT3JNb3JlVHlwZVBhcmFtcyBvbmVPck1vcmVUeXBlUGFyYW1zKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgT25lT3JNb3JlVHlwZVBhcmFtcyByZXRWYWwgPSBuZXcgT25lT3JNb3JlVHlwZVBhcmFtcygpOworICBUeXBlUGFyYW0gdHAxID0gbnVsbDsKKyAgVG9rZW4gY29tbWEgPSBudWxsOworICBUeXBlUGFyYW0gdHBuID0gbnVsbDsKKyAgICB0cDEgPSB0eXBlUGFyYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQodHAxKTsKKyAgICBsYWJlbF83OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoampfMl8yMyg0KSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF83OworICAgICAgfQorICAgICAgY29tbWEgPSBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgIHRwbiA9IHR5cGVQYXJhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhjb21tYSkpOyByZXRWYWwuYWRkQ2hpbGQodHBuKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFR5cGVQYXJhbSB0eXBlUGFyYW0oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUeXBlUGFyYW0gcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gdHlwZVZhck5hbWUgPSBudWxsOworICBUeXBlQm91bmRzSW5mbyB0eXBlQm91bmRzSW5mbyA9IG51bGw7CisgICAgdHlwZVZhck5hbWUgPSBqal9jb25zdW1lX3Rva2VuKElEKTsKKyAgICBpZiAoampfMl8yNCg0KSkgeworICAgICAgdHlwZUJvdW5kc0luZm8gPSB0eXBlQm91bmRzSW5mbygpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIHJldFZhbCA9IG5ldyBUeXBlUGFyYW0oY3JlYXRlVG9rZW5JbmZvKHR5cGVWYXJOYW1lKSwgdHlwZUJvdW5kc0luZm8pOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUeXBlQm91bmRzSW5mbyB0eXBlQm91bmRzSW5mbygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFR5cGVCb3VuZHNJbmZvIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGV4dGVuZHNfS1cgPSBudWxsOworICBPbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMgb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzID0gbnVsbDsKKyAgICBleHRlbmRzX0tXID0gampfY29uc3VtZV90b2tlbihFWFRFTkRTS1cpOworICAgIG9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyA9IG9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcygpOworICAgIHJldFZhbCA9IG5ldyBUeXBlQm91bmRzSW5mbyhjcmVhdGVUb2tlbkluZm8oZXh0ZW5kc19LVyksIG9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIE9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBPbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMgcmV0VmFsID0gbmV3IE9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcygpOworICBCb3VuZEV4Y2VwdFdpbGRjYXJkIHRiMSA9IG51bGw7CisgIFRva2VuIGFtcCA9IG51bGw7CisgIEJvdW5kRXhjZXB0V2lsZGNhcmQgdGJuID0gbnVsbDsKKyAgICB0YjEgPSBib3VuZEV4Y2VwdFdpbGRjYXJkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5hZGRDaGlsZCh0YjEpOworICAgIGxhYmVsXzg6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChqal8yXzI1KDQpKSB7CisgICAgICAgIDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrIGxhYmVsXzg7CisgICAgICB9CisgICAgICBhbXAgPSBqal9jb25zdW1lX3Rva2VuKEFNUCk7CisgICAgICB0Ym4gPSBib3VuZEV4Y2VwdFdpbGRjYXJkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGFtcCkpOyByZXRWYWwuYWRkQ2hpbGQodGJuKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBCb3VuZEV4Y2VwdFdpbGRjYXJkIGJvdW5kRXhjZXB0V2lsZGNhcmQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBCb3VuZEV4Y2VwdFdpbGRjYXJkIHJldFZhbCA9IG51bGw7CisgIFF1YWxpZmllZElEIHJhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lID0gbnVsbDsKKyAgVG9rZW4gbHQgPSBudWxsOworICBPbmVPck1vcmVUeXBlQXJncyBvbmVPck1vcmVUeXBlQXJncyA9IG51bGw7CisgIFRva2VuIGd0ID0gbnVsbDsKKyAgICByYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSA9IHF1YWxpZmllZElEKCk7CisgICAgaWYgKGpqXzJfMjYoNCkpIHsKKyAgICAgIGx0ID0gampfY29uc3VtZV90b2tlbihMVCk7CisgICAgICBvbmVPck1vcmVUeXBlQXJncyA9IG9uZU9yTW9yZVR5cGVBcmdzKCk7CisgICAgICBndCA9IGpqX2NvbnN1bWVfdG9rZW4oR1QpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIHJldFZhbCA9IG5ldyBCb3VuZEV4Y2VwdFdpbGRjYXJkKHJhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lLCBjcmVhdGVUb2tlbkluZm8obHQpLCBvbmVPck1vcmVUeXBlQXJncywgY3JlYXRlVG9rZW5JbmZvKGd0KSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIE9uZU9yTW9yZVR5cGVBcmdzIG9uZU9yTW9yZVR5cGVBcmdzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgT25lT3JNb3JlVHlwZUFyZ3MgcmV0VmFsID0gbmV3IE9uZU9yTW9yZVR5cGVBcmdzKCk7CisgIFR5cGVBcmcgdGExID0gbnVsbDsKKyAgVG9rZW4gY29tbWEgPSBudWxsOworICBUeXBlQXJnIHRhbiA9IG51bGw7CisgICAgdGExID0gdHlwZUFyZygpOworICAgICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQodGExKTsKKyAgICBsYWJlbF85OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoampfMl8yNyg0KSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF85OworICAgICAgfQorICAgICAgY29tbWEgPSBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgIHRhbiA9IHR5cGVBcmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGNvbW1hKSk7IHJldFZhbC5hZGRDaGlsZCh0YW4pOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFR5cGVBcmcgdHlwZUFyZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFR5cGVBcmcgcmV0VmFsID0gbnVsbDsKKyAgICBpZiAoampfMl8yOCg0KSkgeworICAgICAgcmV0VmFsID0gYm91bmRFeGNlcHRXaWxkY2FyZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIH0gZWxzZSBpZiAoampfMl8yOSg0KSkgeworICAgICAgcmV0VmFsID0gd2lsZGNhcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgfSBlbHNlIHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgV2lsZGNhcmQgd2lsZGNhcmQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBXaWxkY2FyZCByZXRWYWwgPSBudWxsOworICBUb2tlbiBxbWFyayA9IG51bGw7CisgIEV4dGVuZHNPclN1cGVyIGV4dGVuZHNPclN1cGVyID0gbnVsbDsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCBib3VuZEV4Y2VwdFdpbGRjYXJkID0gbnVsbDsKKyAgICBxbWFyayA9IGpqX2NvbnN1bWVfdG9rZW4oUU1BUkspOworICAgIGlmIChqal8yXzMwKDQpKSB7CisgICAgICBleHRlbmRzT3JTdXBlciA9IGV4dGVuZHNPclN1cGVyKCk7CisgICAgICBib3VuZEV4Y2VwdFdpbGRjYXJkID0gYm91bmRFeGNlcHRXaWxkY2FyZCgpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIHJldFZhbCA9IG5ldyBXaWxkY2FyZChjcmVhdGVUb2tlbkluZm8ocW1hcmspLCBleHRlbmRzT3JTdXBlciwgYm91bmRFeGNlcHRXaWxkY2FyZCk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEV4dGVuZHNPclN1cGVyIGV4dGVuZHNPclN1cGVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgVG9rZW4gdG9rOworICAgIGlmIChqal8yXzMxKDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKEVYVEVORFNLVyk7CisgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBFeHRlbmRzT3JTdXBlciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfMzIoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oU1VQRVJLVyk7CisgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgRXh0ZW5kc09yU3VwZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQ2xhc3NNZW1iZXJEZWNscyBjbGFzc01lbWJlckRlY2xzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgQ2xhc3NNZW1iZXJEZWNscyByZXRWYWwgPSBuZXcgQ2xhc3NNZW1iZXJEZWNscygpOworICBDbGFzc01lbWJlckRlY2wgY2xhc3NNZW1iZXJEZWNsID0gbnVsbDsKKyAgICBsYWJlbF8xMDoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfMzMoNCkpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfMTA7CisgICAgICB9CisgICAgICBjbGFzc01lbWJlckRlY2wgPSBjbGFzc01lbWJlckRlY2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQoY2xhc3NNZW1iZXJEZWNsKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQ2xhc3NNZW1iZXJEZWNsIGNsYXNzTWVtYmVyRGVjbCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIENsYXNzTWVtYmVyRGVjbCByZXRWYWwgPSBudWxsOworICBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyA9IG51bGw7CisgIE1vZGlmaWVycyBtb2RpZmllcnMgPSBudWxsOworICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMoKTsKKyAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMoKTsKKyAgICBpZiAoampfMl8zNCg0KSkgeworICAgICAgcmV0VmFsID0gYXR0cmlidXRlKGFubm90YXRpb25zLCBtb2RpZmllcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIH0gZWxzZSBpZiAoampfMl8zNSg0KSkgeworICAgICAgcmV0VmFsID0gcmVmZXJlbmNlKGFubm90YXRpb25zLCBtb2RpZmllcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIH0gZWxzZSBpZiAoampfMl8zNig0KSkgeworICAgICAgcmV0VmFsID0gb3BlcmF0aW9uKGFubm90YXRpb25zLCBtb2RpZmllcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIH0gZWxzZSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEF0dHJpYnV0ZSBhdHRyaWJ1dGUoQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMsIE1vZGlmaWVycyBtb2RpZmllcnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIEF0dHJpYnV0ZSByZXRWYWwgPSBudWxsOworICBUb2tlbiBhdHRyX0tXID0gbnVsbDsKKyAgVHlwZVdpdGhNdWx0aSB0eXBlV2l0aE11bHRpID0gbnVsbDsKKyAgVG9rZW4gbmFtZSA9IG51bGw7CisgIFRva2VuIGVxdWFscyA9IG51bGw7CisgIERlZmF1bHRWYWx1ZUV4cHIgZGVmYXVsdFZhbHVlRXhwciA9IG51bGw7CisgIFRva2VuIHNlbWkgPSBudWxsOworICAgIGF0dHJfS1cgPSBqal9jb25zdW1lX3Rva2VuKEFUVFJLVyk7CisgICAgdHlwZVdpdGhNdWx0aSA9IHR5cGVXaXRoTXVsdGkoKTsKKyAgICBuYW1lID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgaWYgKGpqXzJfMzcoNCkpIHsKKyAgICAgIGVxdWFscyA9IGpqX2NvbnN1bWVfdG9rZW4oRVFVQUxTKTsKKyAgICAgIGRlZmF1bHRWYWx1ZUV4cHIgPSBkZWZhdWx0VmFsdWVFeHByKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgc2VtaSA9IGpqX2NvbnN1bWVfdG9rZW4oU0VNSSk7CisgICAgcmV0VmFsID0gbmV3IEF0dHJpYnV0ZShhbm5vdGF0aW9ucywgbW9kaWZpZXJzLCBjcmVhdGVUb2tlbkluZm8oYXR0cl9LVyksIHR5cGVXaXRoTXVsdGksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGVxdWFscyksIGRlZmF1bHRWYWx1ZUV4cHIsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFR5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFR5cGVXaXRoTXVsdGkgcmV0VmFsID0gbnVsbDsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCBuYW1lID0gbnVsbDsKKyAgTXVsdGlwbGljaXR5IG11bHRpcGxpY2l0eSA9IG51bGw7CisgICAgbmFtZSA9IGJvdW5kRXhjZXB0V2lsZGNhcmQoKTsKKyAgICBpZiAoampfMl8zOCg0KSkgeworICAgICAgbXVsdGlwbGljaXR5ID0gbXVsdGlwbGljaXR5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgcmV0VmFsID0gbmV3IFR5cGVXaXRoTXVsdGkobmFtZSwgbXVsdGlwbGljaXR5KTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTXVsdGlwbGljaXR5IG11bHRpcGxpY2l0eSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIE11bHRpcGxpY2l0eSByZXRWYWwgPSBudWxsOworICBUb2tlbiBsc3F1YXJlID0gbnVsbDsKKyAgTXVsdGlwbGljaXR5RXhwciBtdWx0aXBsaWNpdHlFeHByID0gbnVsbDsKKyAgVG9rZW4gcnNxdWFyZSA9IG51bGw7CisgICAgbHNxdWFyZSA9IGpqX2NvbnN1bWVfdG9rZW4oTFNRVUFSRSk7CisgICAgaWYgKGpqXzJfMzkoNCkpIHsKKyAgICAgIG11bHRpcGxpY2l0eUV4cHIgPSBtdWx0aXBsaWNpdHlFeHByKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgcnNxdWFyZSA9IGpqX2NvbnN1bWVfdG9rZW4oUlNRVUFSRSk7CisgICAgcmV0VmFsID0gbmV3IE11bHRpcGxpY2l0eShjcmVhdGVUb2tlbkluZm8obHNxdWFyZSksIG11bHRpcGxpY2l0eUV4cHIsIGNyZWF0ZVRva2VuSW5mbyhyc3F1YXJlKSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIE11bHRpcGxpY2l0eUV4cHIgbXVsdGlwbGljaXR5RXhwcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIE11bHRpcGxpY2l0eUV4cHIgcmV0VmFsID0gbnVsbDsKKyAgU2ltcGxlTXVsdGlwbGljaXR5RXhwciBsb3dlckJvdW5kID0gbnVsbDsKKyAgVG9rZW4gZG90X2RvdCA9IG51bGw7CisgIFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgdXBwZXJCb3VuZCA9IG51bGw7CisgICAgbG93ZXJCb3VuZCA9IHNpbXBsZU11bHRpcGxpY2l0eUV4cHIoKTsKKyAgICBpZiAoampfMl80MCg0KSkgeworICAgICAgZG90X2RvdCA9IGpqX2NvbnN1bWVfdG9rZW4oRE9UX0RPVCk7CisgICAgICB1cHBlckJvdW5kID0gc2ltcGxlTXVsdGlwbGljaXR5RXhwcigpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIHJldFZhbCA9IG5ldyBNdWx0aXBsaWNpdHlFeHByKGxvd2VyQm91bmQsIGNyZWF0ZVRva2VuSW5mbyhkb3RfZG90KSwgdXBwZXJCb3VuZCk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgc2ltcGxlTXVsdGlwbGljaXR5RXhwcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFRva2VuIHRvazsKKyAgICBpZiAoampfMl80MSg0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihTVEFSKTsKKyAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBTaW1wbGVNdWx0aXBsaWNpdHlFeHByIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSBpZiAoampfMl80Mig0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihQTFVTKTsKKyAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBTaW1wbGVNdWx0aXBsaWNpdHlFeHByIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSBpZiAoampfMl80Myg0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihRTUFSSyk7CisgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIGlmIChqal8yXzQ0KDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKElOVF9MSVRFUkFMKTsKKyAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgU2ltcGxlTXVsdGlwbGljaXR5RXhwciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgeworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBSZWZlcmVuY2UgcmVmZXJlbmNlKEFubm90YXRpb25zIGFubm90YXRpb25zLCBNb2RpZmllcnMgbW9kaWZpZXJzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBSZWZlcmVuY2UgcmV0VmFsID0gbnVsbDsKKyAgUmVmZXJlbmNlS2luZCByZWZlcmVuY2VLaW5kID0gbnVsbDsKKyAgVHlwZVdpdGhNdWx0aSB0eXBlV2l0aE11bHRpID0gbnVsbDsKKyAgVG9rZW4gaGFzaCA9IG51bGw7CisgIFRva2VuIG9wcG9zaXRlTmFtZSA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBzZW1pID0gbnVsbDsKKyAgICByZWZlcmVuY2VLaW5kID0gcmVmZXJlbmNlS2luZCgpOworICAgIHR5cGVXaXRoTXVsdGkgPSB0eXBlV2l0aE11bHRpKCk7CisgICAgaWYgKGpqXzJfNDUoNCkpIHsKKyAgICAgIGhhc2ggPSBqal9jb25zdW1lX3Rva2VuKEhBU0gpOworICAgICAgb3Bwb3NpdGVOYW1lID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgbmFtZSA9IGpqX2NvbnN1bWVfdG9rZW4oSUQpOworICAgIHNlbWkgPSBqal9jb25zdW1lX3Rva2VuKFNFTUkpOworICAgIHJldFZhbCA9IG5ldyBSZWZlcmVuY2UoYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgcmVmZXJlbmNlS2luZCwgdHlwZVdpdGhNdWx0aSwgY3JlYXRlVG9rZW5JbmZvKGhhc2gpLCBjcmVhdGVUb2tlbkluZm8ob3Bwb3NpdGVOYW1lKSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oc2VtaSkpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBSZWZlcmVuY2VLaW5kIHJlZmVyZW5jZUtpbmQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUb2tlbiB0b2s7CisgICAgaWYgKGpqXzJfNDYoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oUkVGS1cpOworICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBSZWZlcmVuY2VLaW5kIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSBpZiAoampfMl80Nyg0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihWQUxLVyk7CisgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IFJlZmVyZW5jZUtpbmQgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTW9kaWZpZXJzIG1vZGlmaWVycygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIE1vZGlmaWVycyByZXRWYWwgPSBuZXcgTW9kaWZpZXJzKCk7CisgIE9wdE5lZ2F0ZWRNb2RpZmllciBvcHROZWdhdGVkTW9kaWZpZXIgPSBudWxsOworICAgIGxhYmVsXzExOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoampfMl80OCg0KSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF8xMTsKKyAgICAgIH0KKyAgICAgIG9wdE5lZ2F0ZWRNb2RpZmllciA9IG9wdE5lZ2F0ZWRNb2RpZmllcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5hZGRDaGlsZChvcHROZWdhdGVkTW9kaWZpZXIpOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBPcHROZWdhdGVkTW9kaWZpZXIgb3B0TmVnYXRlZE1vZGlmaWVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgT3B0TmVnYXRlZE1vZGlmaWVyIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGJhbmcgPSBudWxsOworICBNb2RpZmllciBtb2RpZmllciA9IG51bGw7CisgICAgaWYgKGpqXzJfNDkoNCkpIHsKKyAgICAgIGJhbmcgPSBqal9jb25zdW1lX3Rva2VuKEJBTkcpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIG1vZGlmaWVyID0gbW9kaWZpZXIoKTsKKyAgICByZXRWYWwgPSBuZXcgT3B0TmVnYXRlZE1vZGlmaWVyKGNyZWF0ZVRva2VuSW5mbyhiYW5nKSwgbW9kaWZpZXIpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBNb2RpZmllciBtb2RpZmllcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFRva2VuIHRvazsKKyAgICBpZiAoampfMl81MCg0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihSRUFET05MWUtXKTsKKyAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBNb2RpZmllciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNTEoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oVk9MQVRJTEVLVyk7CisgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgTW9kaWZpZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIGlmIChqal8yXzUyKDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKFRSQU5TSUVOVEtXKTsKKyAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgTW9kaWZpZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIGlmIChqal8yXzUzKDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKFVOU0VUVEFCTEVLVyk7CisgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBNb2RpZmllciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNTQoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oREVSSVZFREtXKTsKKyAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSBpZiAoampfMl81NSg0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihVTklRVUVLVyk7CisgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSBpZiAoampfMl81Nig0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihPUkRFUkVES1cpOworICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgTW9kaWZpZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIGlmIChqal8yXzU3KDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKFJFU09MVkVLVyk7CisgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBNb2RpZmllciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNTgoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oSURLVyk7CisgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgTW9kaWZpZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRGVmYXVsdFZhbHVlRXhwciBkZWZhdWx0VmFsdWVFeHByKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgRGVmYXVsdFZhbHVlRXhwciByZXRWYWwgPSBudWxsOworICAgIGlmIChqal8yXzU5KDQpKSB7CisgICAgICByZXRWYWwgPSBib29sRXhwcigpOworICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNjAoNCkpIHsKKyAgICAgIHJldFZhbCA9IGludEV4cHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNjEoNCkpIHsKKyAgICAgIHJldFZhbCA9IHN0cmluZ0V4cHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNjIoNCkpIHsKKyAgICAgIHJldFZhbCA9IGNoYXJFeHByKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIH0gZWxzZSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEJvb2xFeHByIGJvb2xFeHByKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgQm9vbEV4cHIgcmV0VmFsID0gbnVsbDsKKyAgVHJ1ZU9yRmFsc2UgdHJ1ZU9yRmFsc2UgPSBudWxsOworICAgIHRydWVPckZhbHNlID0gdHJ1ZU9yRmFsc2UoKTsKKyAgICByZXRWYWwgPSBuZXcgQm9vbEV4cHIodHJ1ZU9yRmFsc2UpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUcnVlT3JGYWxzZSB0cnVlT3JGYWxzZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFRva2VuIHRvazsKKyAgICBpZiAoampfMl82Myg0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihUUlVFS1cpOworICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgVHJ1ZU9yRmFsc2UgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIGlmIChqal8yXzY0KDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKEZBTFNFS1cpOworICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IFRydWVPckZhbHNlIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEludEV4cHIgaW50RXhwcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIEludEV4cHIgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gbWludXMgPSBudWxsOworICBUb2tlbiBpbnRfbGl0ZXJhbCA9IG51bGw7CisgICAgaWYgKGpqXzJfNjUoNCkpIHsKKyAgICAgIG1pbnVzID0gampfY29uc3VtZV90b2tlbihNSU5VUyk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgaW50X2xpdGVyYWwgPSBqal9jb25zdW1lX3Rva2VuKElOVF9MSVRFUkFMKTsKKyAgICByZXRWYWwgPSBuZXcgSW50RXhwcihjcmVhdGVUb2tlbkluZm8obWludXMpLCBjcmVhdGVUb2tlbkluZm8oaW50X2xpdGVyYWwpKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgU3RyaW5nRXhwciBzdHJpbmdFeHByKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgU3RyaW5nRXhwciByZXRWYWwgPSBudWxsOworICBUb2tlbiBzdHJpbmdfbGl0ZXJhbCA9IG51bGw7CisgICAgc3RyaW5nX2xpdGVyYWwgPSBqal9jb25zdW1lX3Rva2VuKFNUUklOR19MSVRFUkFMKTsKKyAgICByZXRWYWwgPSBuZXcgU3RyaW5nRXhwcihjcmVhdGVUb2tlbkluZm8oc3RyaW5nX2xpdGVyYWwpKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQ2hhckV4cHIgY2hhckV4cHIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBDaGFyRXhwciByZXRWYWwgPSBudWxsOworICBUb2tlbiBjaGFyX2xpdGVyYWwgPSBudWxsOworICAgIGNoYXJfbGl0ZXJhbCA9IGpqX2NvbnN1bWVfdG9rZW4oQ0hBUl9MSVRFUkFMKTsKKyAgICByZXRWYWwgPSBuZXcgQ2hhckV4cHIoY3JlYXRlVG9rZW5JbmZvKGNoYXJfbGl0ZXJhbCkpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBPcGVyYXRpb24gb3BlcmF0aW9uKEFubm90YXRpb25zIGFubm90YXRpb25zLCBNb2RpZmllcnMgbW9kaWZpZXJzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBPcGVyYXRpb24gcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gb3BfS1cgPSBudWxsOworICBUeXBlUGFyYW1zSW5mbyB0eXBlUGFyYW1zSW5mbyA9IG51bGw7CisgIFJlc3VsdFR5cGUgcmVzVHlwZSA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBscGFyZW4gPSBudWxsOworICBQYXJhbXMgcGFyYW1zID0gbnVsbDsKKyAgVG9rZW4gcnBhcmVuID0gbnVsbDsKKyAgVG9rZW4gdGhyb3dzX0tXID0gbnVsbDsKKyAgQ29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkIGV4Y2VwdGlvbnMgPSBudWxsOworICBUb2tlbiBzZW1pID0gbnVsbDsKKyAgICBvcF9LVyA9IGpqX2NvbnN1bWVfdG9rZW4oT1BLVyk7CisgICAgaWYgKGpqXzJfNjYoNCkpIHsKKyAgICAgIHR5cGVQYXJhbXNJbmZvID0gdHlwZVBhcmFtc0luZm8oKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICByZXNUeXBlID0gcmVzdWx0VHlwZSgpOworICAgIG5hbWUgPSBqal9jb25zdW1lX3Rva2VuKElEKTsKKyAgICBscGFyZW4gPSBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7CisgICAgaWYgKGpqXzJfNjcoNCkpIHsKKyAgICAgIHBhcmFtcyA9IHBhcmFtcygpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIHJwYXJlbiA9IGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKKyAgICBpZiAoampfMl82OCg0KSkgeworICAgICAgdGhyb3dzX0tXID0gampfY29uc3VtZV90b2tlbihUSFJPV1NLVyk7CisgICAgICBleGNlcHRpb25zID0gY29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgc2VtaSA9IGpqX2NvbnN1bWVfdG9rZW4oU0VNSSk7CisgICAgcmV0VmFsID0gbmV3IE9wZXJhdGlvbihhbm5vdGF0aW9ucywgbW9kaWZpZXJzLCBjcmVhdGVUb2tlbkluZm8ob3BfS1cpLCB0eXBlUGFyYW1zSW5mbywgcmVzVHlwZSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8obHBhcmVuKSwgcGFyYW1zLCBjcmVhdGVUb2tlbkluZm8ocnBhcmVuKSwgY3JlYXRlVG9rZW5JbmZvKHRocm93c19LVyksIGV4Y2VwdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFJlc3VsdFR5cGUgcmVzdWx0VHlwZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFJlc3VsdFR5cGUgcmV0VmFsID0gbnVsbDsKKyAgICBpZiAoampfMl82OSg0KSkgeworICAgICAgcmV0VmFsID0gdHlwZVdpdGhNdWx0aSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIH0gZWxzZSBpZiAoampfMl83MCg0KSkgeworICAgICAgcmV0VmFsID0gdm9pZENvbnRhaW5lcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIH0gZWxzZSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFZvaWRDb250YWluZXIgdm9pZENvbnRhaW5lcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFZvaWRDb250YWluZXIgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gdm9pZF9LVyA9IG51bGw7CisgICAgdm9pZF9LVyA9IGpqX2NvbnN1bWVfdG9rZW4oVk9JREtXKTsKKyAgICByZXRWYWwgPSBuZXcgVm9pZENvbnRhaW5lcihjcmVhdGVUb2tlbkluZm8odm9pZF9LVykpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBQYXJhbXMgcGFyYW1zKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgUGFyYW1zIHJldFZhbCA9IG5ldyBQYXJhbXMoKTsKKyAgUGFyYW0gcDEgPSBudWxsOworICBUb2tlbiBjb21tYSA9IG51bGw7CisgIFBhcmFtIHBuID0gbnVsbDsKKyAgICBwMSA9IHBhcmFtKCk7CisgICAgICAgICAgICAgICAgIHJldFZhbC5hZGRDaGlsZChwMSk7CisgICAgbGFiZWxfMTI6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChqal8yXzcxKDQpKSB7CisgICAgICAgIDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrIGxhYmVsXzEyOworICAgICAgfQorICAgICAgY29tbWEgPSBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgIHBuID0gcGFyYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGNvbW1hKSk7IHJldFZhbC5hZGRDaGlsZChwbik7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBQYXJhbSBwYXJhbSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFBhcmFtIHJldFZhbCA9IG51bGw7CisgIEFubm90YXRpb25zIGxlYWRpbmdBbm5vdGF0aW9ucyA9IG51bGw7CisgIE1vZGlmaWVycyBtb2RpZmllcnMgPSBudWxsOworICBUeXBlV2l0aE11bHRpIHR5cGVXaXRoTXVsdGkgPSBudWxsOworICBUb2tlbiBuYW1lID0gbnVsbDsKKyAgQW5ub3RhdGlvbnMgdHJhaWxpbmdBbm5vdGF0aW9ucyA9IG51bGw7CisgICAgbGVhZGluZ0Fubm90YXRpb25zID0gYW5ub3RhdGlvbnMoKTsKKyAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMoKTsKKyAgICB0eXBlV2l0aE11bHRpID0gdHlwZVdpdGhNdWx0aSgpOworICAgIG5hbWUgPSBqal9jb25zdW1lX3Rva2VuKElEKTsKKyAgICB0cmFpbGluZ0Fubm90YXRpb25zID0gYW5ub3RhdGlvbnMoKTsKKyAgICByZXRWYWwgPSBuZXcgUGFyYW0obGVhZGluZ0Fubm90YXRpb25zLCBtb2RpZmllcnMsIHR5cGVXaXRoTXVsdGksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgdHJhaWxpbmdBbm5vdGF0aW9ucyk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIERhdGFUeXBlRGVjbCBkYXRhVHlwZURlY2woQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIERhdGFUeXBlRGVjbCByZXRWYWwgPSBudWxsOworICBUcmFuc2llbnRNb2RpZmllciB0cmFuc2llbnRNb2RpZmllciA9IG51bGw7CisgIFRva2VuIGRhdGF0eXBlX0tXID0gbnVsbDsKKyAgVG9rZW4gbmFtZSA9IG51bGw7CisgIFRva2VuIGNvbG9uID0gbnVsbDsKKyAgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgaW5zdENsYXNzTmFtZSA9IG51bGw7CisgIFRva2VuIHNlbWkgPSBudWxsOworICAgIGlmIChqal8yXzcyKDQpKSB7CisgICAgICB0cmFuc2llbnRNb2RpZmllciA9IHRyYW5zaWVudE1vZGlmaWVyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgZGF0YXR5cGVfS1cgPSBqal9jb25zdW1lX3Rva2VuKERBVEFUWVBFS1cpOworICAgIG5hbWUgPSBqal9jb25zdW1lX3Rva2VuKElEKTsKKyAgICBjb2xvbiA9IGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOworICAgIGluc3RDbGFzc05hbWUgPSBzdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCgpOworICAgIHNlbWkgPSBqal9jb25zdW1lX3Rva2VuKFNFTUkpOworICAgIHJldFZhbCA9IG5ldyBEYXRhVHlwZURlY2woYW5ub3RhdGlvbnMsIHRyYW5zaWVudE1vZGlmaWVyLCBjcmVhdGVUb2tlbkluZm8oZGF0YXR5cGVfS1cpLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIGNyZWF0ZVRva2VuSW5mbyhjb2xvbiksIGluc3RDbGFzc05hbWUsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFRyYW5zaWVudE1vZGlmaWVyIHRyYW5zaWVudE1vZGlmaWVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgVHJhbnNpZW50TW9kaWZpZXIgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gdHJhbnNpZW50X0tXID0gbnVsbDsKKyAgICB0cmFuc2llbnRfS1cgPSBqal9jb25zdW1lX3Rva2VuKFRSQU5TSUVOVEtXKTsKKyAgICByZXRWYWwgPSBuZXcgVHJhbnNpZW50TW9kaWZpZXIoY3JlYXRlVG9rZW5JbmZvKHRyYW5zaWVudF9LVykpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFbnVtRGVjbCBlbnVtRGVjbChBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgRW51bURlY2wgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gZW51bV9LVyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBsY3VybHkgPSBudWxsOworICBFbnVtTGl0ZXJhbHMgZW51bUxpdGVyYWxzID0gbnVsbDsKKyAgVG9rZW4gcmN1cmx5ID0gbnVsbDsKKyAgICBlbnVtX0tXID0gampfY29uc3VtZV90b2tlbihFTlVNS1cpOworICAgIG5hbWUgPSBqal9jb25zdW1lX3Rva2VuKElEKTsKKyAgICBsY3VybHkgPSBqal9jb25zdW1lX3Rva2VuKExDVVJMWSk7CisgICAgZW51bUxpdGVyYWxzID0gZW51bUxpdGVyYWxzKCk7CisgICAgcmN1cmx5ID0gampfY29uc3VtZV90b2tlbihSQ1VSTFkpOworICAgIHJldFZhbCA9IG5ldyBFbnVtRGVjbChhbm5vdGF0aW9ucywgY3JlYXRlVG9rZW5JbmZvKGVudW1fS1cpLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIGNyZWF0ZVRva2VuSW5mbyhsY3VybHkpLCBlbnVtTGl0ZXJhbHMsIGNyZWF0ZVRva2VuSW5mbyhyY3VybHkpKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRW51bUxpdGVyYWxzIGVudW1MaXRlcmFscygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIEVudW1MaXRlcmFscyByZXRWYWwgPSBuZXcgRW51bUxpdGVyYWxzKCk7CisgIEVudW1MaXRlcmFsIGVudW1MaXRlcmFsID0gbnVsbDsKKyAgICBsYWJlbF8xMzoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfNzMoNCkpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfMTM7CisgICAgICB9CisgICAgICBlbnVtTGl0ZXJhbCA9IGVudW1MaXRlcmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5hZGRDaGlsZChlbnVtTGl0ZXJhbCk7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEVudW1MaXRlcmFsIGVudW1MaXRlcmFsKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgRW51bUxpdGVyYWwgcmV0VmFsID0gbnVsbDsKKyAgQW5ub3RhdGlvbnMgbGVhZGluZ0Fubm90YXRpb25zID0gbnVsbDsKKyAgVG9rZW4gbmFtZSA9IG51bGw7CisgIFRva2VuIGVxdWFscyA9IG51bGw7CisgIFRva2VuIHZhbCA9IG51bGw7CisgIEFubm90YXRpb25zIHRyYWlsaW5nQW5ub3RhdGlvbnMgPSBudWxsOworICBUb2tlbiBzZW1pID0gbnVsbDsKKyAgICBsZWFkaW5nQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucygpOworICAgIG5hbWUgPSBqal9jb25zdW1lX3Rva2VuKElEKTsKKyAgICBpZiAoampfMl83NCg0KSkgeworICAgICAgZXF1YWxzID0gampfY29uc3VtZV90b2tlbihFUVVBTFMpOworICAgICAgdmFsID0gampfY29uc3VtZV90b2tlbihJTlRfTElURVJBTCk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgdHJhaWxpbmdBbm5vdGF0aW9ucyA9IGFubm90YXRpb25zKCk7CisgICAgc2VtaSA9IGpqX2NvbnN1bWVfdG9rZW4oU0VNSSk7CisgICAgcmV0VmFsID0gbmV3IEVudW1MaXRlcmFsKGxlYWRpbmdBbm5vdGF0aW9ucywgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgY3JlYXRlVG9rZW5JbmZvKHZhbCksIHRyYWlsaW5nQW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIE1hcEVudHJ5RGVjbCBtYXBFbnRyeURlY2woQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIE1hcEVudHJ5RGVjbCByZXRWYWwgPSBudWxsOworICBUb2tlbiBtYXBlbnRyeV9LVyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBjb2xvbiA9IG51bGw7CisgIFR5cGVXaXRoTXVsdGkga2V5ID0gbnVsbDsKKyAgVG9rZW4gbWludXNfZ3QgPSBudWxsOworICBUeXBlV2l0aE11bHRpIHZhbHVlID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7CisgICAgbWFwZW50cnlfS1cgPSBqal9jb25zdW1lX3Rva2VuKE1BUEVOVFJZS1cpOworICAgIG5hbWUgPSBqal9jb25zdW1lX3Rva2VuKElEKTsKKyAgICBjb2xvbiA9IGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOworICAgIGtleSA9IHR5cGVXaXRoTXVsdGkoKTsKKyAgICBtaW51c19ndCA9IGpqX2NvbnN1bWVfdG9rZW4oTUlOVVNfR1QpOworICAgIHZhbHVlID0gdHlwZVdpdGhNdWx0aSgpOworICAgIHNlbWkgPSBqal9jb25zdW1lX3Rva2VuKFNFTUkpOworICAgIHJldFZhbCA9IG5ldyBNYXBFbnRyeURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhtYXBlbnRyeV9LVyksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGNvbG9uKSwga2V5LCBjcmVhdGVUb2tlbkluZm8obWludXNfZ3QpLCB2YWx1ZSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDAsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzMoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl80KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDMsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzUoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM181KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzYoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg1LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl83KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDYsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzgoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM184KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNywgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfOShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzkoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg4LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xMChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzEwKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoOSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTEoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xMSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDEwLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xMihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzEyKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMTEsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzEzKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTMoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxMiwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTQoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xNCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDEzLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xNShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzE1KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMTQsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzE2KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTYoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxNSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTcoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xNygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDE2LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xOChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzE4KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMTcsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzE5KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTkoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxOCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjAoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yMCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDE5LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yMShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzIxKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjAsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIyKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjIoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyMSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjMoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yMygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDIyLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yNChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzI0KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjMsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzI1KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjUoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyNCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjYoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yNigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDI1LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yNyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzI3KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjYsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzI4KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjgoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyNywgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjkoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yOSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDI4LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8zMChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzMwKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjksIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzMxKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzEoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzMCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzIoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zMigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDMxLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8zMyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzMzKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzIsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzM0KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzQoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzMywgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzUoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zNSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDM0LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8zNihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzM2KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzUsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzM3KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzcoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzNiwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzgoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zOCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDM3LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8zOShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzM5KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzgsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzQwKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNDAoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzOSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNDEoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM180MSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQwLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl80MihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQyKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNDEsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzQzKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNDMoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg0MiwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNDQoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM180NCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQzLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl80NShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQ1KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNDQsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzQ2KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNDYoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg0NSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNDcoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM180NygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQ2LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl80OChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQ4KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNDcsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzQ5KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNDkoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg0OCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNTAoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM181MCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQ5LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl81MShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzUxKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNTAsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzUyKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNTIoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg1MSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNTMoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM181MygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDUyLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl81NChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzU0KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNTMsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzU1KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNTUoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg1NCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNTYoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM181NigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDU1LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl81NyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzU3KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNTYsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzU4KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNTgoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg1NywgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNTkoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM181OSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDU4LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl82MChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzYwKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNTksIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzYxKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNjEoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg2MCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNjIoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM182MigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDYxLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl82MyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzYzKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNjIsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzY0KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNjQoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg2MywgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNjUoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM182NSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDY0LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl82NihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzY2KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNjUsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzY3KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNjcoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg2NiwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNjgoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM182OCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDY3LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl82OShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzY5KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNjgsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzcwKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNzAoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg2OSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNzEoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM183MSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDcwLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl83MihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzcyKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNzEsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzczKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNzMoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg3MiwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNzQoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM183NCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDczLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM182NSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihNSU5VUykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NigpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM182NSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKElOVF9MSVRFUkFMKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQU1QKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzI5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTVFJJTkdfTElURVJBTCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzE3KCkgeworICAgIGlmIChqal8zUl8yNygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjQoKSB7CisgICAgaWYgKGpqXzNSXzI5KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzI1KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNSgpIHsKKyAgICBpZiAoampfM1JfMTYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNjQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRkFMU0VLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82OSgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM182MygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM182NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNCgpIHsKKyAgICBpZiAoampfM1JfMTUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjQoKSB7CisgICAgaWYgKGpqXzNSXzMxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzQ1KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEhBU0gpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJRCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzYzKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRSVUVLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81NigpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM180KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzUoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzMoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9MTEFSKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ1KCkgeworICAgIGlmIChqal8zUl82OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzEoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRVhURU5EU0tXKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNCgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18yKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzMoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNzQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRVFVQUxTKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSU5UX0xJVEVSQUwpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xKCkgeworICAgIGlmIChqal8zUl8xNCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJRCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzY4KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRIUk9XU0tXKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzI4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzYyKCkgeworICAgIGlmIChqal8zUl80OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSUQpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18xKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNjEoKSB7CisgICAgaWYgKGpqXzNSXzQ3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzYwKCkgeworICAgIGlmIChqal8zUl80NigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM181OSgpIHsKKyAgICBpZiAoampfM1JfNDUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQwKCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzU5KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzYwKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzYxKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzYyKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJRCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzI0KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjMoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMzAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNTgoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSURLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82MygpIHsKKyAgICBpZiAoampfM1JfMzAoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNfMjMoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM181NygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSRVNPTFZFS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM181NigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihPUkRFUkVES1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM181NSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihVTklRVUVLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzU0KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKERFUklWRURLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzUzKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFVOU0VUVEFCTEVLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzUyKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRSQU5TSUVOVEtXKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNTEoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oVk9MQVRJTEVLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82OCgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM181MCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM181MSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM181MigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM181MygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM181NCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM181NSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM181NigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM181NygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM181OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzUwKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFJFQURPTkxZS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjcoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNjMoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oR1QpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM180OSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihCQU5HKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKE1BUEVOVFJZS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJRCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzUwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NCgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM180OSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl82OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yMigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJTlRFUkZBQ0VLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzQ4KCkgeworICAgIGlmIChqal8zUl80NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjAoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMjEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfMjIoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIxKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENMQVNTS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjUoKSB7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNfNDgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM180MCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihET1RfRE9UKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzY3KCkgeworICAgIGlmIChqal8zUl80OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM180NygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihWQUxLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82NigpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM180NigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM180NygpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNDYoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkVGS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjYoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQUJTVFJBQ1RLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81NCgpIHsKKyAgICBpZiAoampfM1JfNTgoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSUQpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM183NCgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl81OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjAoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMjkoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzcoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRVFVQUxTKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzQwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOCgpIHsKKyAgICBpZiAoampfM1JfMjkoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNfMjAoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzgoKSB7CisgICAgaWYgKGpqXzNSXzY2KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl81MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM180NSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKElEKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzczKCkgeworICAgIGlmIChqal8zUl81NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjIoKSB7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNfNzMoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xNigpIHsKKyAgICBpZiAoampfM1JfMjYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyKCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzE2KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzYwKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElEKSkgcmV0dXJuIHRydWU7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18xNygpKSBqal9zY2FucG9zID0geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMTgoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzE5KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTENVUkxZKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzYxKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJDVVJMWSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzQ0KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElOVF9MSVRFUkFMKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNDMoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUU1BUkspKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRU5VTUtXKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSUQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMQ1VSTFkpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNjIoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkNVUkxZKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNDIoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUExVUykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MygpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM180MSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM180MigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM180MygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM180NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18zOSgpIHsKKyAgICBpZiAoampfM1JfNDIoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNDEoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1RBUikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzM4KCkgeworICAgIGlmIChqal8zUl80MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDIoKSB7CisgICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzQwKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTkoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMjkoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzUzKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFRSQU5TSUVOVEtXKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFBBQ0tBR0VLVykpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElEKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTENVUkxZKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzU5KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJDVVJMWSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzcyKCkgeworICAgIGlmIChqal8zUl81MygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDEoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFNRVUFSRSkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzM5KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUlNRVUFSRSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMygpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM183MigpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKERBVEFUWVBFS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJRCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzU2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzkoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSUQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihFUVVBTFMpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xNSgpIHsKKyAgICBpZiAoampfM1JfMjUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTQoKSB7CisgICAgaWYgKGpqXzNSXzI0KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzEzKCkgeworICAgIGlmIChqal8zUl8yMygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xMigpIHsKKyAgICBpZiAoampfM1JfMjIoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTEoKSB7CisgICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MCgpIHsKKyAgICBpZiAoampfM1JfMjkoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMzgoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjAoKSB7CisgICAgaWYgKGpqXzNSXzU4KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzExKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzEyKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzEzKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzE0KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzE1KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xMCgpIHsKKyAgICBpZiAoampfM1JfMjAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzUyKCkgeworICAgIGlmIChqal8zUl81OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNjUoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzUwKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElEKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzU4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81OSgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18xMCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihBVFRSS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNTAoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSUQpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18zNygpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUkpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM183MSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl81MigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDkoKSB7CisgICAgaWYgKGpqXzNSXzUyKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzcxKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElNUE9SVEtXKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfOSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl81NigpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzYoKSB7CisgICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzM1KCkgeworICAgIGlmIChqal8zUl8zOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18zNCgpIHsKKyAgICBpZiAoampfM1JfMzcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfOCgpIHsKKyAgICBpZiAoampfM1JfMTkoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzUxKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFZPSURLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNigpIHsKKyAgICBpZiAoampfM1JfNTgoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzY1KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzM0KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzM1KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzM2KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNjYoKSB7CisgICAgaWYgKGpqXzNSXzI3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzI2KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzMyKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKEdUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzMoKSB7CisgICAgaWYgKGpqXzNSXzM2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzcwKCkgeworICAgIGlmIChqal8zUl81MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM182OSgpIHsKKyAgICBpZiAoampfM1JfNTAoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzYxKCkgeworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzMzKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzAoKSB7CisgICAgaWYgKGpqXzNSXzM1KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjcoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfNjkoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNzAoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOCgpIHsKKyAgICBpZiAoampfM1JfNTYoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRVFVQUxTKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzU2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzMyKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNVUEVSS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzUoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMzEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfMzIoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzcoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMTgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzEoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRVhURU5EU0tXKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU3KCkgeworICAgIGlmIChqal8zUl8xOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzkoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oT1BLVykpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzY2KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNSXzY3KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElEKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTgoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRVhURU5EU0tXKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzI4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zNCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihRTUFSSykpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzMwKCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEFUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzU2KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl81NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yOSgpIHsKKyAgICBpZiAoampfM1JfMzQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjgoKSB7CisgICAgaWYgKGpqXzNSXzI5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMygpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18yOCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM18yOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNigpIHsKKyAgICBpZiAoampfM1JfMTcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjcoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMzMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ4KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENIQVJfTElURVJBTCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81OCgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM182KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyKCkgeworICAgIGlmIChqal8zUl8zMygpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18yNygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTVFJJTkdfTElURVJBTCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNigpIHsKKyAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5KCkgeworICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18yNigpKSBqal9zY2FucG9zID0geHNwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyIHRva2VuX3NvdXJjZTsKKyAgU2ltcGxlQ2hhclN0cmVhbSBqal9pbnB1dF9zdHJlYW07CisgIHB1YmxpYyBUb2tlbiB0b2tlbiwgampfbnQ7CisgIHByaXZhdGUgaW50IGpqX250azsKKyAgcHJpdmF0ZSBUb2tlbiBqal9zY2FucG9zLCBqal9sYXN0cG9zOworICBwcml2YXRlIGludCBqal9sYTsKKyAgcHVibGljIGJvb2xlYW4gbG9va2luZ0FoZWFkID0gZmFsc2U7CisgIHByaXZhdGUgYm9vbGVhbiBqal9zZW1MQTsKKyAgcHJpdmF0ZSBpbnQgampfZ2VuOworICBmaW5hbCBwcml2YXRlIGludFtdIGpqX2xhMSA9IG5ldyBpbnRbMF07CisgIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV8wOworICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfMTsKKyAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzI7CisgIHN0YXRpYyB7CisgICAgICBqal9sYTFfMCgpOworICAgICAgampfbGExXzEoKTsKKyAgICAgIGpqX2xhMV8yKCk7CisgICB9CisgICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV8wKCkgeworICAgICAgampfbGExXzAgPSBuZXcgaW50W10ge307CisgICB9CisgICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV8xKCkgeworICAgICAgampfbGExXzEgPSBuZXcgaW50W10ge307CisgICB9CisgICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV8yKCkgeworICAgICAgampfbGExXzIgPSBuZXcgaW50W10ge307CisgICB9CisgIGZpbmFsIHByaXZhdGUgSkpDYWxsc1tdIGpqXzJfcnRucyA9IG5ldyBKSkNhbGxzWzc0XTsKKyAgcHJpdmF0ZSBib29sZWFuIGpqX3Jlc2NhbiA9IGZhbHNlOworICBwcml2YXRlIGludCBqal9nYyA9IDA7CisKKyAgcHVibGljIEVtZmF0aWNQYXJzZXIoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgdGhpcyhzdHJlYW0sIG51bGwpOworICB9CisgIHB1YmxpYyBFbWZhdGljUGFyc2VyKGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICB0cnkgeyBqal9pbnB1dF9zdHJlYW0gPSBuZXcgU2ltcGxlQ2hhclN0cmVhbShzdHJlYW0sIGVuY29kaW5nLCAxLCAxKTsgfSBjYXRjaChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsgfQorICAgIHRva2VuX3NvdXJjZSA9IG5ldyBFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyKGpqX2lucHV0X3N0cmVhbSk7CisgICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBqal9nZW4gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSkgeworICAgICBSZUluaXQoc3RyZWFtLCBudWxsKTsKKyAgfQorICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0sIFN0cmluZyBlbmNvZGluZykgeworICAgIHRyeSB7IGpqX2lucHV0X3N0cmVhbS5SZUluaXQoc3RyZWFtLCBlbmNvZGluZywgMSwgMSk7IH0gY2F0Y2goamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0KKyAgICB0b2tlbl9zb3VyY2UuUmVJbml0KGpqX2lucHV0X3N0cmVhbSk7CisgICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBqal9nZW4gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKKyAgfQorCisgIHB1YmxpYyBFbWZhdGljUGFyc2VyKGphdmEuaW8uUmVhZGVyIHN0cmVhbSkgeworICAgIGpqX2lucHV0X3N0cmVhbSA9IG5ldyBTaW1wbGVDaGFyU3RyZWFtKHN0cmVhbSwgMSwgMSk7CisgICAgdG9rZW5fc291cmNlID0gbmV3IEVtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIoampfaW5wdXRfc3RyZWFtKTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAwOyBpKyspIGpqX2xhMVtpXSA9IC0xOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOworICB9CisKKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIHN0cmVhbSkgeworICAgIGpqX2lucHV0X3N0cmVhbS5SZUluaXQoc3RyZWFtLCAxLCAxKTsKKyAgICB0b2tlbl9zb3VyY2UuUmVJbml0KGpqX2lucHV0X3N0cmVhbSk7CisgICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBqal9nZW4gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKKyAgfQorCisgIHB1YmxpYyBFbWZhdGljUGFyc2VyKEVtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKKyAgICB0b2tlbl9zb3VyY2UgPSB0bTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAwOyBpKyspIGpqX2xhMVtpXSA9IC0xOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOworICB9CisKKyAgcHVibGljIHZvaWQgUmVJbml0KEVtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKKyAgICB0b2tlbl9zb3VyY2UgPSB0bTsKKyAgICB0b2tlbiA9IG5ldyBUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbiA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAwOyBpKyspIGpqX2xhMVtpXSA9IC0xOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBUb2tlbiBqal9jb25zdW1lX3Rva2VuKGludCBraW5kKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgIFRva2VuIG9sZFRva2VuOworICAgIGlmICgob2xkVG9rZW4gPSB0b2tlbikubmV4dCAhPSBudWxsKSB0b2tlbiA9IHRva2VuLm5leHQ7CisgICAgZWxzZSB0b2tlbiA9IHRva2VuLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7CisgICAgampfbnRrID0gLTE7CisgICAgaWYgKHRva2VuLmtpbmQgPT0ga2luZCkgeworICAgICAgampfZ2VuKys7CisgICAgICBpZiAoKytqal9nYyA+IDEwMCkgeworICAgICAgICBqal9nYyA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgSkpDYWxscyBjID0gampfMl9ydG5zW2ldOworICAgICAgICAgIHdoaWxlIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjLmdlbiA8IGpqX2dlbikgYy5maXJzdCA9IG51bGw7CisgICAgICAgICAgICBjID0gYy5uZXh0OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKyAgICB0b2tlbiA9IG9sZFRva2VuOworICAgIGpqX2tpbmQgPSBraW5kOworICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsKKyAgfQorCisgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGNsYXNzIExvb2thaGVhZFN1Y2Nlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuRXJyb3IgeyB9CisgIGZpbmFsIHByaXZhdGUgTG9va2FoZWFkU3VjY2VzcyBqal9scyA9IG5ldyBMb29rYWhlYWRTdWNjZXNzKCk7CisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal9zY2FuX3Rva2VuKGludCBraW5kKSB7CisgICAgaWYgKGpqX3NjYW5wb3MgPT0gampfbGFzdHBvcykgeworICAgICAgampfbGEtLTsKKyAgICAgIGlmIChqal9zY2FucG9zLm5leHQgPT0gbnVsbCkgeworICAgICAgICBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0OworICAgIH0KKyAgICBpZiAoampfcmVzY2FuKSB7CisgICAgICBpbnQgaSA9IDA7IFRva2VuIHRvayA9IHRva2VuOworICAgICAgd2hpbGUgKHRvayAhPSBudWxsICYmIHRvayAhPSBqal9zY2FucG9zKSB7IGkrKzsgdG9rID0gdG9rLm5leHQ7IH0KKyAgICAgIGlmICh0b2sgIT0gbnVsbCkgampfYWRkX2Vycm9yX3Rva2VuKGtpbmQsIGkpOworICAgIH0KKyAgICBpZiAoampfc2NhbnBvcy5raW5kICE9IGtpbmQpIHJldHVybiB0cnVlOworICAgIGlmIChqal9sYSA9PSAwICYmIGpqX3NjYW5wb3MgPT0gampfbGFzdHBvcykgdGhyb3cgampfbHM7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHVibGljIFRva2VuIGdldE5leHRUb2tlbigpIHsKKyAgICBpZiAodG9rZW4ubmV4dCAhPSBudWxsKSB0b2tlbiA9IHRva2VuLm5leHQ7CisgICAgZWxzZSB0b2tlbiA9IHRva2VuLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7CisgICAgampfbnRrID0gLTE7CisgICAgampfZ2VuKys7CisgICAgcmV0dXJuIHRva2VuOworICB9CisKKyAgZmluYWwgcHVibGljIFRva2VuIGdldFRva2VuKGludCBpbmRleCkgeworICAgIFRva2VuIHQgPSBsb29raW5nQWhlYWQgPyBqal9zY2FucG9zIDogdG9rZW47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7CisgICAgICBpZiAodC5uZXh0ICE9IG51bGwpIHQgPSB0Lm5leHQ7CisgICAgICBlbHNlIHQgPSB0Lm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7CisgICAgfQorICAgIHJldHVybiB0OworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBpbnQgampfbnRrKCkgeworICAgIGlmICgoampfbnQ9dG9rZW4ubmV4dCkgPT0gbnVsbCkKKyAgICAgIHJldHVybiAoampfbnRrID0gKHRva2VuLm5leHQ9dG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpKS5raW5kKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gKGpqX250ayA9IGpqX250LmtpbmQpOworICB9CisKKyAgcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yPGludFtdPiBqal9leHBlbnRyaWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3I8aW50W10+KCk7CisgIHByaXZhdGUgaW50W10gampfZXhwZW50cnk7CisgIHByaXZhdGUgaW50IGpqX2tpbmQgPSAtMTsKKyAgcHJpdmF0ZSBpbnRbXSBqal9sYXN0dG9rZW5zID0gbmV3IGludFsxMDBdOworICBwcml2YXRlIGludCBqal9lbmRwb3M7CisKKyAgcHJpdmF0ZSB2b2lkIGpqX2FkZF9lcnJvcl90b2tlbihpbnQga2luZCwgaW50IHBvcykgeworICAgIGlmIChwb3MgPj0gMTAwKSByZXR1cm47CisgICAgaWYgKHBvcyA9PSBqal9lbmRwb3MgKyAxKSB7CisgICAgICBqal9sYXN0dG9rZW5zW2pqX2VuZHBvcysrXSA9IGtpbmQ7CisgICAgfSBlbHNlIGlmIChqal9lbmRwb3MgIT0gMCkgeworICAgICAgampfZXhwZW50cnkgPSBuZXcgaW50W2pqX2VuZHBvc107CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2VuZHBvczsgaSsrKSB7CisgICAgICAgIGpqX2V4cGVudHJ5W2ldID0gampfbGFzdHRva2Vuc1tpXTsKKyAgICAgIH0KKyAgICAgIGJvb2xlYW4gZXhpc3RzID0gZmFsc2U7CisgICAgICBmb3IgKGphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gampfZXhwZW50cmllcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICBpbnRbXSBvbGRlbnRyeSA9IChpbnRbXSkoZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgaWYgKG9sZGVudHJ5Lmxlbmd0aCA9PSBqal9leHBlbnRyeS5sZW5ndGgpIHsKKyAgICAgICAgICBleGlzdHMgPSB0cnVlOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZXhwZW50cnkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChvbGRlbnRyeVtpXSAhPSBqal9leHBlbnRyeVtpXSkgeworICAgICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChleGlzdHMpIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWV4aXN0cykgampfZXhwZW50cmllcy5hZGRFbGVtZW50KGpqX2V4cGVudHJ5KTsKKyAgICAgIGlmIChwb3MgIT0gMCkgampfbGFzdHRva2Vuc1soampfZW5kcG9zID0gcG9zKSAtIDFdID0ga2luZDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24gZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpIHsKKyAgICBqal9leHBlbnRyaWVzLnJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgYm9vbGVhbltdIGxhMXRva2VucyA9IG5ldyBib29sZWFuWzcyXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDcyOyBpKyspIHsKKyAgICAgIGxhMXRva2Vuc1tpXSA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoampfa2luZCA+PSAwKSB7CisgICAgICBsYTF0b2tlbnNbampfa2luZF0gPSB0cnVlOworICAgICAgampfa2luZCA9IC0xOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDA7IGkrKykgeworICAgICAgaWYgKGpqX2xhMVtpXSA9PSBqal9nZW4pIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzMjsgaisrKSB7CisgICAgICAgICAgaWYgKChqal9sYTFfMFtpXSAmICgxPDxqKSkgIT0gMCkgeworICAgICAgICAgICAgbGExdG9rZW5zW2pdID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChqal9sYTFfMVtpXSAmICgxPDxqKSkgIT0gMCkgeworICAgICAgICAgICAgbGExdG9rZW5zWzMyK2pdID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChqal9sYTFfMltpXSAmICgxPDxqKSkgIT0gMCkgeworICAgICAgICAgICAgbGExdG9rZW5zWzY0K2pdID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3MjsgaSsrKSB7CisgICAgICBpZiAobGExdG9rZW5zW2ldKSB7CisgICAgICAgIGpqX2V4cGVudHJ5ID0gbmV3IGludFsxXTsKKyAgICAgICAgampfZXhwZW50cnlbMF0gPSBpOworICAgICAgICBqal9leHBlbnRyaWVzLmFkZEVsZW1lbnQoampfZXhwZW50cnkpOworICAgICAgfQorICAgIH0KKyAgICBqal9lbmRwb3MgPSAwOworICAgIGpqX3Jlc2Nhbl90b2tlbigpOworICAgIGpqX2FkZF9lcnJvcl90b2tlbigwLCAwKTsKKyAgICBpbnRbXVtdIGV4cHRva3NlcSA9IG5ldyBpbnRbampfZXhwZW50cmllcy5zaXplKCldW107CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9leHBlbnRyaWVzLnNpemUoKTsgaSsrKSB7CisgICAgICBleHB0b2tzZXFbaV0gPSAoaW50W10pampfZXhwZW50cmllcy5lbGVtZW50QXQoaSk7CisgICAgfQorICAgIHJldHVybiBuZXcgUGFyc2VFeGNlcHRpb24odG9rZW4sIGV4cHRva3NlcSwgdG9rZW5JbWFnZSk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgdm9pZCBlbmFibGVfdHJhY2luZygpIHsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyB2b2lkIGRpc2FibGVfdHJhY2luZygpIHsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgdm9pZCBqal9yZXNjYW5fdG9rZW4oKSB7CisgICAgampfcmVzY2FuID0gdHJ1ZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDc0OyBpKyspIHsKKyAgICB0cnkgeworICAgICAgSkpDYWxscyBwID0gampfMl9ydG5zW2ldOworICAgICAgZG8geworICAgICAgICBpZiAocC5nZW4gPiBqal9nZW4pIHsKKyAgICAgICAgICBqal9sYSA9IHAuYXJnOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHAuZmlyc3Q7CisgICAgICAgICAgc3dpdGNoIChpKSB7CisgICAgICAgICAgICBjYXNlIDA6IGpqXzNfMSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogampfM18yKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBqal8zXzMoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IGpqXzNfNCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDogampfM181KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OiBqal8zXzYoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6IGpqXzNfNygpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzogampfM184KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OiBqal8zXzkoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk6IGpqXzNfMTAoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwOiBqal8zXzExKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTogampfM18xMigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTI6IGpqXzNfMTMoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzOiBqal8zXzE0KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDogampfM18xNSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6IGpqXzNfMTYoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OiBqal8zXzE3KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNzogampfM18xOCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTg6IGpqXzNfMTkoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5OiBqal8zXzIwKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMDogampfM18yMSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjE6IGpqXzNfMjIoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyOiBqal8zXzIzKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMzogampfM18yNCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ6IGpqXzNfMjUoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI1OiBqal8zXzI2KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNjogampfM18yNygpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjc6IGpqXzNfMjgoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI4OiBqal8zXzI5KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOTogampfM18zMCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzA6IGpqXzNfMzEoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxOiBqal8zXzMyKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMjogampfM18zMygpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzM6IGpqXzNfMzQoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM0OiBqal8zXzM1KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNTogampfM18zNigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzY6IGpqXzNfMzcoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM3OiBqal8zXzM4KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzODogampfM18zOSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzk6IGpqXzNfNDAoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQwOiBqal8zXzQxKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MTogampfM180MigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDI6IGpqXzNfNDMoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQzOiBqal8zXzQ0KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NDogampfM180NSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDU6IGpqXzNfNDYoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ2OiBqal8zXzQ3KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NzogampfM180OCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDg6IGpqXzNfNDkoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ5OiBqal8zXzUwKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MDogampfM181MSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTE6IGpqXzNfNTIoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUyOiBqal8zXzUzKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MzogampfM181NCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTQ6IGpqXzNfNTUoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU1OiBqal8zXzU2KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NjogampfM181NygpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTc6IGpqXzNfNTgoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU4OiBqal8zXzU5KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OTogampfM182MCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjA6IGpqXzNfNjEoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYxOiBqal8zXzYyKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MjogampfM182MygpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjM6IGpqXzNfNjQoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY0OiBqal8zXzY1KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NTogampfM182NigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjY6IGpqXzNfNjcoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY3OiBqal8zXzY4KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA2ODogampfM182OSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjk6IGpqXzNfNzAoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcwOiBqal8zXzcxKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MTogampfM183MigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzI6IGpqXzNfNzMoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDczOiBqal8zXzc0KCk7IGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwID0gcC5uZXh0OworICAgICAgfSB3aGlsZSAocCAhPSBudWxsKTsKKyAgICAgIH0gY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyB9CisgICAgfQorICAgIGpqX3Jlc2NhbiA9IGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSB2b2lkIGpqX3NhdmUoaW50IGluZGV4LCBpbnQgeGxhKSB7CisgICAgSkpDYWxscyBwID0gampfMl9ydG5zW2luZGV4XTsKKyAgICB3aGlsZSAocC5nZW4gPiBqal9nZW4pIHsKKyAgICAgIGlmIChwLm5leHQgPT0gbnVsbCkgeyBwID0gcC5uZXh0ID0gbmV3IEpKQ2FsbHMoKTsgYnJlYWs7IH0KKyAgICAgIHAgPSBwLm5leHQ7CisgICAgfQorICAgIHAuZ2VuID0gampfZ2VuICsgeGxhIC0gampfbGE7IHAuZmlyc3QgPSB0b2tlbjsgcC5hcmcgPSB4bGE7CisgIH0KKworICBzdGF0aWMgZmluYWwgY2xhc3MgSkpDYWxscyB7CisgICAgaW50IGdlbjsKKyAgICBUb2tlbiBmaXJzdDsKKyAgICBpbnQgYXJnOworICAgIEpKQ2FsbHMgbmV4dDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvRW1mYXRpY1BhcnNlckNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvamF2YWNjUGFyc2VyL0VtZmF0aWNQYXJzZXJDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYThlZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvamF2YWNjUGFyc2VyL0VtZmF0aWNQYXJzZXJDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBFbWZhdGljUGFyc2VyQ29uc3RhbnRzLmphdmEgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgRW1mYXRpY1BhcnNlckNvbnN0YW50cyB7CisKKyAgaW50IEVPRiA9IDA7CisgIGludCBTSU5HTEVMSU5FQ09NTUVOVCA9IDE7CisgIGludCBXUyA9IDI7CisgIGludCBQQUNLQUdFS1cgPSA2OworICBpbnQgQ0xBU1NLVyA9IDc7CisgIGludCBJTVBPUlRLVyA9IDg7CisgIGludCBBQlNUUkFDVEtXID0gOTsKKyAgaW50IElOVEVSRkFDRUtXID0gMTA7CisgIGludCBFWFRFTkRTS1cgPSAxMTsKKyAgaW50IFNVUEVSS1cgPSAxMjsKKyAgaW50IEFUVFJLVyA9IDEzOworICBpbnQgUkVGS1cgPSAxNDsKKyAgaW50IFZBTEtXID0gMTU7CisgIGludCBSRUFET05MWUtXID0gMTY7CisgIGludCBWT0xBVElMRUtXID0gMTc7CisgIGludCBUUkFOU0lFTlRLVyA9IDE4OworICBpbnQgVU5TRVRUQUJMRUtXID0gMTk7CisgIGludCBERVJJVkVES1cgPSAyMDsKKyAgaW50IFVOSVFVRUtXID0gMjE7CisgIGludCBPUkRFUkVES1cgPSAyMjsKKyAgaW50IFJFU09MVkVLVyA9IDIzOworICBpbnQgSURLVyA9IDI0OworICBpbnQgVFJVRUtXID0gMjU7CisgIGludCBGQUxTRUtXID0gMjY7CisgIGludCBPUEtXID0gMjc7CisgIGludCBWT0lES1cgPSAyODsKKyAgaW50IERBVEFUWVBFS1cgPSAyOTsKKyAgaW50IEVOVU1LVyA9IDMwOworICBpbnQgTUFQRU5UUllLVyA9IDMxOworICBpbnQgVEhST1dTS1cgPSAzMjsKKyAgaW50IERPVUJMRVNMQVNIID0gMzM7CisgIGludCBET1VCTEVRVU9URSA9IDM0OworICBpbnQgU0lOR0xFUVVPVEUgPSAzNTsKKyAgaW50IEJBQ0tTTEFTSCA9IDM2OworICBpbnQgTENVUkxZID0gMzc7CisgIGludCBSQ1VSTFkgPSAzODsKKyAgaW50IExTUVVBUkUgPSAzOTsKKyAgaW50IFJTUVVBUkUgPSA0MDsKKyAgaW50IExQQVJFTiA9IDQxOworICBpbnQgUlBBUkVOID0gNDI7CisgIGludCBET1QgPSA0MzsKKyAgaW50IENPTU1BID0gNDQ7CisgIGludCBDT0xPTiA9IDQ1OworICBpbnQgU0VNSSA9IDQ2OworICBpbnQgU1RBUiA9IDQ3OworICBpbnQgUExVUyA9IDQ4OworICBpbnQgTUlOVVMgPSA0OTsKKyAgaW50IEVRVUFMUyA9IDUwOworICBpbnQgUU1BUksgPSA1MTsKKyAgaW50IEJBTkcgPSA1MjsKKyAgaW50IERPTExBUiA9IDUzOworICBpbnQgSEFTSCA9IDU0OworICBpbnQgQVQgPSA1NTsKKyAgaW50IERPVF9ET1QgPSA1NjsKKyAgaW50IE1JTlVTX0dUID0gNTc7CisgIGludCBHVF9MVCA9IDU4OworICBpbnQgTFRfR1QgPSA1OTsKKyAgaW50IEFNUCA9IDYwOworICBpbnQgTFQgPSA2MTsKKyAgaW50IEdUID0gNjI7CisgIGludCBTVFJJTkdfTElURVJBTCA9IDYzOworICBpbnQgQ0hBUl9MSVRFUkFMID0gNjQ7CisgIGludCBMRVRURVJPUlVOREVSU0NPUkUgPSA2NTsKKyAgaW50IExFVFRFUk9SVU5ERVJTQ09SRU9SRElHSVQgPSA2NjsKKyAgaW50IElOVF9MSVRFUkFMID0gNjc7CisgIGludCBESUdJVCA9IDY4OworICBpbnQgRVNDID0gNjk7CisgIGludCBESUdJVERJR0lURElHSVQgPSA3MDsKKyAgaW50IElEID0gNzE7CisKKyAgaW50IERFRkFVTFQgPSAwOworICBpbnQgV2l0aGluQ29tbWVudCA9IDE7CisKKyAgU3RyaW5nW10gdG9rZW5JbWFnZSA9IHsKKyAgICAiPEVPRj4iLAorICAgICI8U0lOR0xFTElORUNPTU1FTlQ+IiwKKyAgICAiPFdTPiIsCisgICAgIlwiLypcIiIsCisgICAgIlwiKi9cIiIsCisgICAgIjx0b2tlbiBvZiBraW5kIDU+IiwKKyAgICAiXCJwYWNrYWdlXCIiLAorICAgICJcImNsYXNzXCIiLAorICAgICJcImltcG9ydFwiIiwKKyAgICAiXCJhYnN0cmFjdFwiIiwKKyAgICAiXCJpbnRlcmZhY2VcIiIsCisgICAgIlwiZXh0ZW5kc1wiIiwKKyAgICAiXCJzdXBlclwiIiwKKyAgICAiXCJhdHRyXCIiLAorICAgICJcInJlZlwiIiwKKyAgICAiXCJ2YWxcIiIsCisgICAgIlwicmVhZG9ubHlcIiIsCisgICAgIlwidm9sYXRpbGVcIiIsCisgICAgIlwidHJhbnNpZW50XCIiLAorICAgICJcInVuc2V0dGFibGVcIiIsCisgICAgIlwiZGVyaXZlZFwiIiwKKyAgICAiXCJ1bmlxdWVcIiIsCisgICAgIlwib3JkZXJlZFwiIiwKKyAgICAiXCJyZXNvbHZlXCIiLAorICAgICJcImlkXCIiLAorICAgICJcInRydWVcIiIsCisgICAgIlwiZmFsc2VcIiIsCisgICAgIlwib3BcIiIsCisgICAgIlwidm9pZFwiIiwKKyAgICAiXCJkYXRhdHlwZVwiIiwKKyAgICAiXCJlbnVtXCIiLAorICAgICJcIm1hcGVudHJ5XCIiLAorICAgICJcInRocm93c1wiIiwKKyAgICAiXCIvL1wiIiwKKyAgICAiXCJcXFwiXCIiLAorICAgICJcIlxcXCdcIiIsCisgICAgIlwiXFxcXFwiIiwKKyAgICAiXCJ7XCIiLAorICAgICJcIn1cIiIsCisgICAgIlwiW1wiIiwKKyAgICAiXCJdXCIiLAorICAgICJcIihcIiIsCisgICAgIlwiKVwiIiwKKyAgICAiXCIuXCIiLAorICAgICJcIixcIiIsCisgICAgIlwiOlwiIiwKKyAgICAiXCI7XCIiLAorICAgICJcIipcIiIsCisgICAgIlwiK1wiIiwKKyAgICAiXCItXCIiLAorICAgICJcIj1cIiIsCisgICAgIlwiP1wiIiwKKyAgICAiXCIhXCIiLAorICAgICJcIiRcIiIsCisgICAgIlwiI1wiIiwKKyAgICAiXCJAXCIiLAorICAgICJcIi4uXCIiLAorICAgICJcIi0+XCIiLAorICAgICJcIj48XCIiLAorICAgICJcIjw+XCIiLAorICAgICJcIiZcIiIsCisgICAgIlwiPFwiIiwKKyAgICAiXCI+XCIiLAorICAgICI8U1RSSU5HX0xJVEVSQUw+IiwKKyAgICAiPENIQVJfTElURVJBTD4iLAorICAgICI8TEVUVEVST1JVTkRFUlNDT1JFPiIsCisgICAgIjxMRVRURVJPUlVOREVSU0NPUkVPUkRJR0lUPiIsCisgICAgIjxJTlRfTElURVJBTD4iLAorICAgICI8RElHSVQ+IiwKKyAgICAiPEVTQz4iLAorICAgICI8RElHSVRESUdJVERJR0lUPiIsCisgICAgIjxJRD4iLAorICB9OworCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvRW1mYXRpY1BhcnNlckRyaXZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvamF2YWNjUGFyc2VyL0VtZmF0aWNQYXJzZXJEcml2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGVmYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvamF2YWNjUGFyc2VyL0VtZmF0aWNQYXJzZXJEcml2ZXIuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwOS4wMi4yMDA3IDEzOjAzOjA1CisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLnBhcnNlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkRpYWdub3N0aWNpYW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmF0b3IuZWNvcmUuQnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lY29yZS5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmF0b3IuZWNvcmUuRW1mYXRpY1NlbWFudGljV2FybmluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Db21wVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5wYXJzZXIuSVBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5wYXJzZXIuUGFyc2VDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLnBhcnNlci5QYXJzZUVycm9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLnBhcnNlci5QYXJzZU1lc3NhZ2U7CisKK3B1YmxpYyBjbGFzcyBFbWZhdGljUGFyc2VyRHJpdmVyIGltcGxlbWVudHMgSVBhcnNlciB7CisKKyAgICBwdWJsaWMgUGFyc2VDb250ZXh0IHBhcnNlKFJlYWRlciBpbnB1dCkgeworICAgIAkKKyAgICAJRXh0U2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0gPSBuZXcgRXh0U2ltcGxlQ2hhclN0cmVhbShpbnB1dCk7CisgICAgCUV4dEVtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIgdG9rZW5NYW5hZ2VyID0gbmV3IEV4dEVtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIoc3RyZWFtKTsKKyAgICAJRW1mYXRpY1BhcnNlciBwYXJzZXIgPSBuZXcgRW1mYXRpY1BhcnNlcih0b2tlbk1hbmFnZXIpOworICAgIAlQYXJzZUNvbnRleHQgcGFyc2VDb250ZXh0ID0gbmV3IFBhcnNlQ29udGV4dCgpOworICAgIAlDb21wVW5pdCBjb21wVW5pdCA9IHBhcnNlQ29tcFVuaXQocGFyc2VyLCBwYXJzZUNvbnRleHQpOworICAgIAlpZiAoY29tcFVuaXQgIT0gbnVsbCkgeworCQkJRVBhY2thZ2Ugcm9vdFBhY2thZ2UgPSBhZGRFcnJvcnNGcm9tQVNUKHBhcnNlQ29udGV4dCk7CisJCQkvLyBmb3IgY29uc3VtcHRpb24gYnkgY2hhbmdlIGxpc3RlbmVycyAobm90aWZpZWQgYnkgdGhlIGVkaXRvcikKKwkJCWNvbXBVbml0LnNldEFTVChyb290UGFja2FnZSk7CisJCX0KKyAgICAJCisgICAgCWlmIChwYXJzZUNvbnRleHQuZ2V0TWVzc2FnZUNvdW50KCkgPT0gMCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJQYXJzZSBPSyEiKTsKKwkJfQorCQllbHNlIHsKKwkJCVBhcnNlTWVzc2FnZVtdIG1zZ3MgPSBwYXJzZUNvbnRleHQuZ2V0TWVzc2FnZXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykgeworCQkJCS8vIFN5c3RlbS5lcnIucHJpbnRsbihtc2dzW2ldLmdldE1lc3NhZ2UoKSk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBwYXJzZUNvbnRleHQ7CisgICAgfQorICAgIAorICAgIAlwcml2YXRlIEVQYWNrYWdlIGFkZEVycm9yc0Zyb21BU1QoUGFyc2VDb250ZXh0IHBhcnNlQ29udGV4dCkgeworCQlFUGFja2FnZSByb290UGFja2FnZSA9IG51bGw7CisJCS8vIHdhcm5pZ25zIGFuZCBlcnJvcnMgY29tcHV0ZWQgbm90IGZyb20gdGhlIENTVCBidXQgZnJvbSB0aGUgQVNUCisJCUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7CisJCU51bGxQcm9ncmVzc01vbml0b3IgbnBtID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7CisJCVVSSSB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSSgiZHVtbXkiKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZSh1cmkpOworCQl0cnkgeworCQkJYnVpbGRlci5idWlsZChwYXJzZUNvbnRleHQsIHJlc291cmNlLCBucG0pOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCWlmICghcGFyc2VDb250ZXh0Lmhhc0Vycm9ycygpKSB7CisJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvcihidWlsZGVyKTsKKwkJCWNvbm5lY3Rvci5jb25uZWN0KHBhcnNlQ29udGV4dCwgcmVzb3VyY2UsIG5wbSk7CisJCQlyb290UGFja2FnZSA9IChFUGFja2FnZSkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7CisJCQlpZiAocm9vdFBhY2thZ2UgIT0gbnVsbCkgeworCQkJCS8vIGludm9rZSBFY29yZVZhbGlkYXRvcgorCQkJCURpYWdub3N0aWNpYW4gZGlhZ25vc3RpY2lhbiA9IG5ldyBEaWFnbm9zdGljaWFuKCk7CisJCQkJZmluYWwgRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gZGlhZ25vc3RpY2lhbi52YWxpZGF0ZShyb290UGFja2FnZSk7CisJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSA9PSBEaWFnbm9zdGljLk9LKSB7CisJCQkJCXJldHVybiByb290UGFja2FnZTsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBBIHR1dG9yaWFsIG9uIG1hcmtlcnM6CisJCQkJICogCisJCQkJICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hcnRpY2xlcy9BcnRpY2xlLU1hcmslMjBNeSUyMFdvcmRzL21hcmstbXktd29yZHMuaHRtbAorCQkJCSAqIAorCQkJCSAqLworCisJCQkJQ29tcFVuaXQgY29tcFVuaXQgPSAoQ29tcFVuaXQpIHBhcnNlQ29udGV4dC5nZXRQYXJzZVJvb3QoKTsKKwkJCQlmb3IgKERpYWdub3N0aWMgY2hpbGREaWFnbm9zdGljIDogZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpKSB7CisJCQkJCVNldDxBU1ROb2RlPiBwcm9ibGVtTm9kZXMgPSBuZXcgSGFzaFNldDxBU1ROb2RlPigpOworCQkJCQlTdHJpbmcgZE1zZyA9IGNoaWxkRGlhZ25vc3RpYy5nZXRNZXNzYWdlKCk7CisJCQkJCWlmIChjaGlsZERpYWdub3N0aWMuZ2V0RGF0YSgpLnNpemUoKSA+IDApIHsKKwkJCQkJCU9iamVjdCBwcmltYXJ5U291cmNlT2ZQcm9ibGVtID0gY2hpbGREaWFnbm9zdGljLmdldERhdGEoKS5nZXQoMCk7CisJCQkJCQlpZiAocHJpbWFyeVNvdXJjZU9mUHJvYmxlbSAhPSBudWxsICYmIHByaW1hcnlTb3VyY2VPZlByb2JsZW0gaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQkJCQkJU2V0PEFTVE5vZGU+IGNzdFVzZXMgPSBjb21wVW5pdC5nZXRFY29yZURlY2wyQ3N0VXNlKCkuZ2V0KChFT2JqZWN0KSBwcmltYXJ5U291cmNlT2ZQcm9ibGVtKTsKKwkJCQkJCQlwcm9ibGVtTm9kZXMuYWRkQWxsKGNzdFVzZXMpOworCQkJCQkJCWlmIChwcm9ibGVtTm9kZXMuc2l6ZSgpID09IDApIHsKKwkJCQkJCQkJcHJvYmxlbU5vZGVzLmFkZChjb21wVW5pdC5nZXRQYWNrYWdlRGVjbCgpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZm9yIChBU1ROb2RlIHByb2JsZW1Ob2RlIDogcHJvYmxlbU5vZGVzKSB7CisJCQkJCQlQYXJzZU1lc3NhZ2UgcE1zZyA9IG5ldyBFbWZhdGljU2VtYW50aWNXYXJuaW5nLkVjb3JlVmFsaWRhdG9yRGlhZ25vc3RpYyhwcm9ibGVtTm9kZSwgZE1zZyk7CisJCQkJCQlwYXJzZUNvbnRleHQuYWRkUGFyc2VNZXNzYWdlKHBNc2cpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByb290UGFja2FnZTsKKwl9CisgICAgCisgICAgcHJpdmF0ZSBDb21wVW5pdCBwYXJzZUNvbXBVbml0KEVtZmF0aWNQYXJzZXIgcGFyc2VyLCBQYXJzZUNvbnRleHQgcGFyc2VDb250ZXh0KSB7CisgICAgCXRyeSB7CisJCQlDb21wVW5pdCBjb21wVW5pdCA9IHBhcnNlci5jb21wVW5pdCgpOworCQkJcGFyc2VDb250ZXh0LnNldFBhcnNlUm9vdChjb21wVW5pdCk7CisJCQlyZXR1cm4gY29tcFVuaXQ7CisJCX0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGV4KSB7CisJCQlQYXJzZUVycm9yIHBhcnNlRXJyb3I7CisJCQlUb2tlbiB0b2tlbiA9IGV4LmN1cnJlbnRUb2tlbjsKKwkJCWlmICh0b2tlbiBpbnN0YW5jZW9mIEV4dFRva2VuKSB7CisJCQkJRXh0VG9rZW4gZXh0VG9rZW4gPSAoRXh0VG9rZW4pIHRva2VuOworCQkJCWludCBvZmZzZXQgPSBleHRUb2tlbi50b2tlbk9mZnNldDsKKwkJCQlTdHJpbmcgdG9rZW5UZXh0ID0gdG9rZW4uaW1hZ2U7CisJCQkJaW50IGxlbmd0aCA9ICh0b2tlblRleHQgPT0gbnVsbCkgPyAwIDogdG9rZW5UZXh0Lmxlbmd0aCgpOworCQkJCXBhcnNlRXJyb3IgPSBuZXcgUGFyc2VFcnJvcihleC5nZXRNZXNzYWdlKCksIG9mZnNldCwgbGVuZ3RoKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBhcnNlRXJyb3IgPSBuZXcgUGFyc2VFcnJvcihleC5nZXRNZXNzYWdlKCksIDEpOworCQkJfQorCQkJcGFyc2VDb250ZXh0LmFkZFBhcnNlTWVzc2FnZShwYXJzZUVycm9yKTsKKwkJfQorCQljYXRjaCAoVG9rZW5NZ3JFcnJvciBleCkgeworCQkJUGFyc2VFcnJvciBwYXJzZUVycm9yID0gbmV3IFBhcnNlRXJyb3IoZXguZ2V0TWVzc2FnZSgpLCAxKTsKKwkJCXBhcnNlQ29udGV4dC5hZGRQYXJzZU1lc3NhZ2UocGFyc2VFcnJvcik7CisJCX0KKwkJcmV0dXJuIG51bGw7IAorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL2phdmFjY1BhcnNlci9FbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvRW1mYXRpY1BhcnNlclRva2VuTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzM4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvRW1mYXRpY1BhcnNlclRva2VuTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTA1NyBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuKjsKKworcHVibGljIGNsYXNzIEVtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIgaW1wbGVtZW50cyBFbWZhdGljUGFyc2VyQ29uc3RhbnRzCit7CisgIHB1YmxpYyAgamF2YS5pby5QcmludFN0cmVhbSBkZWJ1Z1N0cmVhbSA9IFN5c3RlbS5vdXQ7CisgIHB1YmxpYyAgdm9pZCBzZXREZWJ1Z1N0cmVhbShqYXZhLmlvLlByaW50U3RyZWFtIGRzKSB7IGRlYnVnU3RyZWFtID0gZHM7IH0KK3ByaXZhdGUgZmluYWwgaW50IGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMChpbnQgcG9zLCBsb25nIGFjdGl2ZTApCit7CisgICBzd2l0Y2ggKHBvcykKKyAgIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4OEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDFmZmZmZmZjMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDcxOworICAgICAgICAgICAgcmV0dXJuIDI2OworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSAxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg5MDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gMjY7CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDFmNmZmZmZjMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDcxOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKKyAgICAgICAgICAgIHJldHVybiAyNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4YzAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDI2OworICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxZjZmZjNmYzBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3MTsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDI7CisgICAgICAgICAgICByZXR1cm4gMjY7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDM6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDUyMDAyMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gMjY7CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDFhNGZmMWZjMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDcxOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKKyAgICAgICAgICAgIHJldHVybiAyNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMTA4MEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDI2OworICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxYTBmZjBmNDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3MTsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDQ7CisgICAgICAgICAgICByZXR1cm4gMjY7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDU6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDIwMDEwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDI2OworICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhhMGRmMGU0MEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDcxOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNTsKKyAgICAgICAgICAgIHJldHVybiAyNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4YTAwZjA2MDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3MTsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDY7CisgICAgICAgICAgICByZXR1cm4gMjY7CisgICAgICAgICB9CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGQwMDg0MEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDI2OworICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSA3OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhhMDAzMDIwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDI2OworICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhjMDQwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDcxOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNzsKKyAgICAgICAgICAgIHJldHVybiAyNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgODoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDA0MDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiAyNjsKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDBMKSAhPSAwTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3MTsKKyAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDg7CisgICAgICAgICAgICByZXR1cm4gMjY7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIHJldHVybiAtMTsKKyAgIH0KK30KK3ByaXZhdGUgZmluYWwgaW50IGpqU3RhcnROZmFfMChpbnQgcG9zLCBsb25nIGFjdGl2ZTApCit7CisgICByZXR1cm4gampNb3ZlTmZhXzAoampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKHBvcywgYWN0aXZlMCksIHBvcyArIDEpOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampTdG9wQXRQb3MoaW50IHBvcywgaW50IGtpbmQpCit7CisgICBqam1hdGNoZWRLaW5kID0ga2luZDsKKyAgIGpqbWF0Y2hlZFBvcyA9IHBvczsKKyAgIHJldHVybiBwb3MgKyAxOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampTdGFydE5mYVdpdGhTdGF0ZXNfMChpbnQgcG9zLCBpbnQga2luZCwgaW50IHN0YXRlKQoreworICAgamptYXRjaGVkS2luZCA9IGtpbmQ7CisgICBqam1hdGNoZWRQb3MgPSBwb3M7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyByZXR1cm4gcG9zICsgMTsgfQorICAgcmV0dXJuIGpqTW92ZU5mYV8wKHN0YXRlLCBwb3MgKyAxKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKQoreworICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDMzOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDUyKTsKKyAgICAgIGNhc2UgMzU6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNTQpOworICAgICAgY2FzZSAzNjoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA1Myk7CisgICAgICBjYXNlIDM4OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDYwKTsKKyAgICAgIGNhc2UgNDA6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNDEpOworICAgICAgY2FzZSA0MToKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA0Mik7CisgICAgICBjYXNlIDQyOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDQ3KTsKKyAgICAgIGNhc2UgNDM6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNDgpOworICAgICAgY2FzZSA0NDoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA0NCk7CisgICAgICBjYXNlIDQ1OgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDQ5OworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMDAwMDAwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgNDY6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gNDM7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMDAwMDAwMDAwMEwpOworICAgICAgY2FzZSA0NzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4OEwpOworICAgICAgY2FzZSA1ODoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA0NSk7CisgICAgICBjYXNlIDU5OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDQ2KTsKKyAgICAgIGNhc2UgNjA6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gNjE7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDAwMDAwMDAwMDAwMEwpOworICAgICAgY2FzZSA2MToKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA1MCk7CisgICAgICBjYXNlIDYyOgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDYyOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDAwMDAwMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgNjM6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNTEpOworICAgICAgY2FzZSA2NDoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA1NSk7CisgICAgICBjYXNlIDkxOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDM5KTsKKyAgICAgIGNhc2UgOTM6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNDApOworICAgICAgY2FzZSA5NzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjIwMEwpOworICAgICAgY2FzZSA5OToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODBMKTsKKyAgICAgIGNhc2UgMTAwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMDEwMDAwMEwpOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwODAwTCk7CisgICAgICBjYXNlIDEwMjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDAwMEwpOworICAgICAgY2FzZSAxMDU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDA1MDBMKTsKKyAgICAgIGNhc2UgMTA5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDAwMDAwMEwpOworICAgICAgY2FzZSAxMTE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDg0MDAwMDBMKTsKKyAgICAgIGNhc2UgMTEyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MEwpOworICAgICAgY2FzZSAxMTQ6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgxNDAwMEwpOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDBMKTsKKyAgICAgIGNhc2UgMTE2OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDIwNDAwMDBMKTsKKyAgICAgIGNhc2UgMTE3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyODAwMDBMKTsKKyAgICAgIGNhc2UgMTE4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAyODAwMEwpOworICAgICAgY2FzZSAxMjM6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzcpOworICAgICAgY2FzZSAxMjU6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzgpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7CisgICB9Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKGxvbmcgYWN0aXZlMCkKK3sKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMCwgYWN0aXZlMCk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA0MjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4OEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDMpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ2OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA1Nik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjA6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDU4KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2MjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgNTcpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDU5KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA5NzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4YTQwMDgwNDBMKTsKKyAgICAgIGNhc2UgOTg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMEwpOworICAgICAgY2FzZSAxMDA6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDI0LCAyNik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg5MTQwMDBMKTsKKyAgICAgIGNhc2UgMTA0OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTA4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg4MEwpOworICAgICAgY2FzZSAxMDk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDQwMjgwNDAwTCk7CisgICAgICBjYXNlIDExMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMjAwMDBMKTsKKyAgICAgIGNhc2UgMTEyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAyNywgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExNDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjQ0MDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDBMKTsKKyAgICAgIGNhc2UgMTE3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwTCk7CisgICAgICBjYXNlIDEyMDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCgwLCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMCwgb2xkMCk7IAorICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgxLCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiAyOworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDk3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg1MDA4MEwpOworICAgICAgY2FzZSA5OToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4NDBMKTsKKyAgICAgIGNhc2UgMTAwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg0MDAwMDBMKTsKKyAgICAgIGNhc2UgMTAyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCAxNCwgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MTAyMDAwMDBMKTsKKyAgICAgIGNhc2UgMTA4OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCAxNSwgMjYpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg0MDIwMDAwTCk7CisgICAgICBjYXNlIDExMjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODAwMDExMDBMKTsKKyAgICAgIGNhc2UgMTE0OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgxMDAxMDAwMDBMKTsKKyAgICAgIGNhc2UgMTE1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg4ODAyMDBMKTsKKyAgICAgIGNhc2UgMTE2OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgyMDAwMmMwMEwpOworICAgICAgY2FzZSAxMTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDQyMDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxLCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMSwgb2xkMCk7IAorICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgyLCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiAzOworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDk3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDAyMDAwMEwpOworICAgICAgY2FzZSAxMDA6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCAyOCwgMjYpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxMDAwMEwpOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDI1LCAyNik7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwNDgxYzAwTCk7CisgICAgICBjYXNlIDEwNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MTAwMDAwTCk7CisgICAgICBjYXNlIDEwNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4NDBMKTsKKyAgICAgIGNhc2UgMTA5OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMzAsIDI2KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDQwMDAwTCk7CisgICAgICBjYXNlIDExMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MTAwODAwMTAwTCk7CisgICAgICBjYXNlIDExMzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MjAwMDAwTCk7CisgICAgICBjYXNlIDExNDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMTMsIDI2KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDQwMDAwODBMKTsKKyAgICAgIGNhc2UgMTE2OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDIsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgyLCBvbGQwKTsgCisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDMsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDQ7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDQwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgMjYsIDI2KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDgwMDAwMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDgwMDAwODAwTCk7CisgICAgICBjYXNlIDExMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MTAwMDBMKTsKKyAgICAgIGNhc2UgMTE0OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCAxMiwgMjYpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg0MDA3MDBMKTsKKyAgICAgIGNhc2UgMTE1OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgNywgMjYpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg0MDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDIwMGEwMDAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MjAwMDAwTCk7CisgICAgICBjYXNlIDExODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MTAwMDAwTCk7CisgICAgICBjYXNlIDExOToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCgzLCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMywgb2xkMCk7IAorICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg0LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiA1OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDk3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgyMDBMKTsKKyAgICAgIGNhc2UgMTAwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg4MDBMKTsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDIxLCAyNik7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDUwMDAwMEwpOworICAgICAgY2FzZSAxMDI6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDQwMEwpOworICAgICAgY2FzZSAxMDM6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDQwTCk7CisgICAgICBjYXNlIDEwNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4NjAwMDBMKTsKKyAgICAgIGNhc2UgMTEwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgxMDAwMEwpOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgMzIsIDI2KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgOCwgMjYpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg4MDA4MDAwMEwpOworICAgICAgY2FzZSAxMTg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDgwMDAwMEwpOworICAgICAgY2FzZSAxMjE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDIwMDAwMDAwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg0LCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNCwgb2xkMCk7IAorICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg1LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiA2OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDk3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHg4MDQwMEwpOworICAgICAgY2FzZSA5OToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4MjAwTCk7CisgICAgICBjYXNlIDEwMDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCAyMCwgMjYpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgMjIsIDI2KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCA2LCAyNik7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCAyMywgMjYpOworICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHg0MDAwMEwpOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDMwMDAwTCk7CisgICAgICBjYXNlIDExMjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4MjAwMDAwMDBMKTsKKyAgICAgIGNhc2UgMTE0OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHg4MDAwMDAwMEwpOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgMTEsIDI2KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoNSwgYWN0aXZlMCk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDUsIG9sZDApOyAKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoNiwgYWN0aXZlMCk7CisgICAgICByZXR1cm4gNzsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA5ODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4ODAwMDBMKTsKKyAgICAgIGNhc2UgOTk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChhY3RpdmUwLCAweDQwMEwpOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCAxNywgMjYpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCAyOSwgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExMDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4NDAwMDBMKTsKKyAgICAgIGNhc2UgMTE2OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDksIDI2KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMjE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCAxNiwgMjYpOworICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCAzMSwgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg2LCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE4XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNiwgb2xkMCk7IAorICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg3LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiA4OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg4LCAxMCwgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGFjdGl2ZTAsIDB4ODAwMDBMKTsKKyAgICAgIGNhc2UgMTE2OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoOCwgMTgsIDI2KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoNywgYWN0aXZlMCk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDcsIG9sZDApOyAKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoOCwgYWN0aXZlMCk7CisgICAgICByZXR1cm4gOTsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSAxMDE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg5LCAxOSwgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg4LCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZChpbnQgc3RhdGUpCit7CisgICBpZiAoampyb3VuZHNbc3RhdGVdICE9IGpqcm91bmQpCisgICB7CisgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBzdGF0ZTsKKyAgICAgIGpqcm91bmRzW3N0YXRlXSA9IGpqcm91bmQ7CisgICB9Cit9Citwcml2YXRlIGZpbmFsIHZvaWQgampBZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICAgZG8geworICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gampuZXh0U3RhdGVzW3N0YXJ0XTsKKyAgIH0gd2hpbGUgKHN0YXJ0KysgIT0gZW5kKTsKK30KK3ByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFR3b1N0YXRlcyhpbnQgc3RhdGUxLCBpbnQgc3RhdGUyKQoreworICAgampDaGVja05BZGQoc3RhdGUxKTsKKyAgIGpqQ2hlY2tOQWRkKHN0YXRlMik7Cit9Citwcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICAgZG8geworICAgICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0XSk7CisgICB9IHdoaWxlIChzdGFydCsrICE9IGVuZCk7Cit9Citwcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRTdGF0ZXMoaW50IHN0YXJ0KQoreworICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0XSk7CisgICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnQgKyAxXSk7Cit9CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMCA9IHsKKyAgIDB4MEwsIDB4MEwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwKK307Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVOZmFfMChpbnQgc3RhcnRTdGF0ZSwgaW50IGN1clBvcykKK3sKKyAgIGludFtdIG5leHRTdGF0ZXM7CisgICBpbnQgc3RhcnRzQXQgPSAwOworICAgampuZXdTdGF0ZUNudCA9IDI3OworICAgaW50IGkgPSAxOworICAgampzdGF0ZVNldFswXSA9IHN0YXJ0U3RhdGU7CisgICBpbnQgaiwga2luZCA9IDB4N2ZmZmZmZmY7CisgICBmb3IgKDs7KQorICAgeworICAgICAgaWYgKCsrampyb3VuZCA9PSAweDdmZmZmZmZmKQorICAgICAgICAgUmVJbml0Um91bmRzKCk7CisgICAgICBpZiAoY3VyQ2hhciA8IDY0KQorICAgICAgeworICAgICAgICAgbG9uZyBsID0gMUwgPDwgY3VyQ2hhcjsKKyAgICAgICAgIE1hdGNoTG9vcDogZG8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NykKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NzsKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDIzKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgweDEwMDAwMzYwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyOworICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNik7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDM5KQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMCwgMSk7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDM0KQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMiwgNCk7CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDQ3KQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDcpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1LCA3KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZmZmZmRiZmZMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1LCA3KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAgJiYga2luZCA+IDEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTMpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MTAwMDAzNjAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gMjsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDYpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzNCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIsIDQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ODQwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIsIDQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZiZmZmZmZmZmZMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyLCA0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM0ICYmIGtpbmQgPiA2MykKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2MzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMzsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxNDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyLCA0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM5KQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMCwgMSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ODQwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE4KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM5ICYmIGtpbmQgPiA2NCkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyMTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxOCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmN2ZmZmZmZmZmZkwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE4KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjcpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNjc7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgyMyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjY7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChjdXJDaGFyIDwgMTI4KQorICAgICAgeworICAgICAgICAgbG9uZyBsID0gMUwgPDwgKGN1ckNoYXIgJiAwNzcpOworICAgICAgICAgTWF0Y2hMb29wOiBkbworICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlODdmZmZmZmVMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMjYpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAxMjYpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyNTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoNSwgNyk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoOCwgOSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgxNDQwNDAxMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIsIDQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMiwgNCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDEwLCAxMSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4MTQ0MDQwMTAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxOCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxOCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMjYpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyNTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZmZmZTg3ZmZmZmZlTCAmIGwpID09IDBMKQorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcxKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcxOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMjYpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaW50IGkyID0gKGN1ckNoYXIgJiAweGZmKSA+PiA2OworICAgICAgICAgbG9uZyBsMiA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKKyAgICAgICAgIE1hdGNoTG9vcDogZG8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMl0gJiBsMikgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcyg1LCA3KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgIGlmICgoampiaXRWZWMwW2kyXSAmIGwyKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDIsIDQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgaWYgKChqamJpdFZlYzBbaTJdICYgbDIpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTg7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7CisgICAgICB9CisgICAgICBpZiAoa2luZCAhPSAweDdmZmZmZmZmKQorICAgICAgeworICAgICAgICAgamptYXRjaGVkS2luZCA9IGtpbmQ7CisgICAgICAgICBqam1hdGNoZWRQb3MgPSBjdXJQb3M7CisgICAgICAgICBraW5kID0gMHg3ZmZmZmZmZjsKKyAgICAgIH0KKyAgICAgICsrY3VyUG9zOworICAgICAgaWYgKChpID0gampuZXdTdGF0ZUNudCkgPT0gKHN0YXJ0c0F0ID0gMjcgLSAoampuZXdTdGF0ZUNudCA9IHN0YXJ0c0F0KSkpCisgICAgICAgICByZXR1cm4gY3VyUG9zOworICAgICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsgcmV0dXJuIGN1clBvczsgfQorICAgfQorfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMSgpCit7CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgNDI6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMSgweDEwTCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIHJldHVybiAxOworICAgfQorfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMShsb25nIGFjdGl2ZTApCit7CisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIDE7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgNDc6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgNCk7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgcmV0dXJuIDI7CisgICB9CisgICByZXR1cm4gMjsKK30KK3N0YXRpYyBmaW5hbCBpbnRbXSBqam5leHRTdGF0ZXMgPSB7CisgICAxNiwgMjIsIDgsIDEwLCAxMSwgMSwgMiwgNCwgOSwgMTIsIDE3LCAxOSwgCit9OworcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBqanN0ckxpdGVyYWxJbWFnZXMgPSB7CisiIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIlwxNjBcMTQxXDE0M1wxNTNcMTQxXDE0N1wxNDUiLCAKKyJcMTQzXDE1NFwxNDFcMTYzXDE2MyIsICJcMTUxXDE1NVwxNjBcMTU3XDE2MlwxNjQiLCAiXDE0MVwxNDJcMTYzXDE2NFwxNjJcMTQxXDE0M1wxNjQiLCAKKyJcMTUxXDE1NlwxNjRcMTQ1XDE2MlwxNDZcMTQxXDE0M1wxNDUiLCAiXDE0NVwxNzBcMTY0XDE0NVwxNTZcMTQ0XDE2MyIsICJcMTYzXDE2NVwxNjBcMTQ1XDE2MiIsICJcMTQxXDE2NFwxNjRcMTYyIiwgCisiXDE2MlwxNDVcMTQ2IiwgIlwxNjZcMTQxXDE1NCIsICJcMTYyXDE0NVwxNDFcMTQ0XDE1N1wxNTZcMTU0XDE3MSIsIAorIlwxNjZcMTU3XDE1NFwxNDFcMTY0XDE1MVwxNTRcMTQ1IiwgIlwxNjRcMTYyXDE0MVwxNTZcMTYzXDE1MVwxNDVcMTU2XDE2NCIsIAorIlwxNjVcMTU2XDE2M1wxNDVcMTY0XDE2NFwxNDFcMTQyXDE1NFwxNDUiLCAiXDE0NFwxNDVcMTYyXDE1MVwxNjZcMTQ1XDE0NCIsICJcMTY1XDE1NlwxNTFcMTYxXDE2NVwxNDUiLCAKKyJcMTU3XDE2MlwxNDRcMTQ1XDE2MlwxNDVcMTQ0IiwgIlwxNjJcMTQ1XDE2M1wxNTdcMTU0XDE2NlwxNDUiLCAiXDE1MVwxNDQiLCAiXDE2NFwxNjJcMTY1XDE0NSIsIAorIlwxNDZcMTQxXDE1NFwxNjNcMTQ1IiwgIlwxNTdcMTYwIiwgIlwxNjZcMTU3XDE1MVwxNDQiLCAiXDE0NFwxNDFcMTY0XDE0MVwxNjRcMTcxXDE2MFwxNDUiLCAKKyJcMTQ1XDE1NlwxNjVcMTU1IiwgIlwxNTVcMTQxXDE2MFwxNDVcMTU2XDE2NFwxNjJcMTcxIiwgIlwxNjRcMTUwXDE2MlwxNTdcMTY3XDE2MyIsIG51bGwsIG51bGwsIAorbnVsbCwgbnVsbCwgIlwxNzMiLCAiXDE3NSIsICJcMTMzIiwgIlwxMzUiLCAiXDUwIiwgIlw1MSIsICJcNTYiLCAiXDU0IiwgIlw3MiIsIAorIlw3MyIsICJcNTIiLCAiXDUzIiwgIlw1NSIsICJcNzUiLCAiXDc3IiwgIlw0MSIsICJcNDQiLCAiXDQzIiwgIlwxMDAiLCAiXDU2XDU2IiwgCisiXDU1XDc2IiwgIlw3Nlw3NCIsICJcNzRcNzYiLCAiXDQ2IiwgIlw3NCIsICJcNzYiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAKK251bGwsIG51bGwsIG51bGwsIH07CitwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxleFN0YXRlTmFtZXMgPSB7CisgICAiREVGQVVMVCIsIAorICAgIldpdGhpbkNvbW1lbnQiLCAKK307CitwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGpqbmV3TGV4U3RhdGUgPSB7CisgICAtMSwgLTEsIC0xLCAxLCAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gamp0b1Rva2VuID0geworICAgMHhmZmZmZmZlMWZmZmZmZmMxTCwgMHg4OUwsIAorfTsKK3N0YXRpYyBmaW5hbCBsb25nW10gamp0b1NraXAgPSB7CisgICAweDFlTCwgMHgwTCwgCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvTW9yZSA9IHsKKyAgIDB4MjBMLCAweDBMLCAKK307Citwcm90ZWN0ZWQgU2ltcGxlQ2hhclN0cmVhbSBpbnB1dF9zdHJlYW07Citwcml2YXRlIGZpbmFsIGludFtdIGpqcm91bmRzID0gbmV3IGludFsyN107Citwcml2YXRlIGZpbmFsIGludFtdIGpqc3RhdGVTZXQgPSBuZXcgaW50WzU0XTsKK3Byb3RlY3RlZCBjaGFyIGN1ckNoYXI7CitwdWJsaWMgRW1mYXRpY1BhcnNlclRva2VuTWFuYWdlcihTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSl7CisgICBpZiAoU2ltcGxlQ2hhclN0cmVhbS5zdGF0aWNGbGFnKQorICAgICAgdGhyb3cgbmV3IEVycm9yKCJFUlJPUjogQ2Fubm90IHVzZSBhIHN0YXRpYyBDaGFyU3RyZWFtIGNsYXNzIHdpdGggYSBub24tc3RhdGljIGxleGljYWwgYW5hbHl6ZXIuIik7CisgICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07Cit9CitwdWJsaWMgRW1mYXRpY1BhcnNlclRva2VuTWFuYWdlcihTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSwgaW50IGxleFN0YXRlKXsKKyAgIHRoaXMoc3RyZWFtKTsKKyAgIFN3aXRjaFRvKGxleFN0YXRlKTsKK30KK3B1YmxpYyB2b2lkIFJlSW5pdChTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSkKK3sKKyAgIGpqbWF0Y2hlZFBvcyA9IGpqbmV3U3RhdGVDbnQgPSAwOworICAgY3VyTGV4U3RhdGUgPSBkZWZhdWx0TGV4U3RhdGU7CisgICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07CisgICBSZUluaXRSb3VuZHMoKTsKK30KK3ByaXZhdGUgZmluYWwgdm9pZCBSZUluaXRSb3VuZHMoKQoreworICAgaW50IGk7CisgICBqanJvdW5kID0gMHg4MDAwMDAwMTsKKyAgIGZvciAoaSA9IDI3OyBpLS0gPiAwOykKKyAgICAgIGpqcm91bmRzW2ldID0gMHg4MDAwMDAwMDsKK30KK3B1YmxpYyB2b2lkIFJlSW5pdChTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSwgaW50IGxleFN0YXRlKQoreworICAgUmVJbml0KHN0cmVhbSk7CisgICBTd2l0Y2hUbyhsZXhTdGF0ZSk7Cit9CitwdWJsaWMgdm9pZCBTd2l0Y2hUbyhpbnQgbGV4U3RhdGUpCit7CisgICBpZiAobGV4U3RhdGUgPj0gMiB8fCBsZXhTdGF0ZSA8IDApCisgICAgICB0aHJvdyBuZXcgVG9rZW5NZ3JFcnJvcigiRXJyb3I6IElnbm9yaW5nIGludmFsaWQgbGV4aWNhbCBzdGF0ZSA6ICIgKyBsZXhTdGF0ZSArICIuIFN0YXRlIHVuY2hhbmdlZC4iLCBUb2tlbk1nckVycm9yLklOVkFMSURfTEVYSUNBTF9TVEFURSk7CisgICBlbHNlCisgICAgICBjdXJMZXhTdGF0ZSA9IGxleFN0YXRlOworfQorCitwcm90ZWN0ZWQgVG9rZW4gampGaWxsVG9rZW4oKQoreworICAgVG9rZW4gdCA9IFRva2VuLm5ld1Rva2VuKGpqbWF0Y2hlZEtpbmQpOworICAgdC5raW5kID0gamptYXRjaGVkS2luZDsKKyAgIFN0cmluZyBpbSA9IGpqc3RyTGl0ZXJhbEltYWdlc1tqam1hdGNoZWRLaW5kXTsKKyAgIHQuaW1hZ2UgPSAoaW0gPT0gbnVsbCkgPyBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKSA6IGltOworICAgdC5iZWdpbkxpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5MaW5lKCk7CisgICB0LmJlZ2luQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luQ29sdW1uKCk7CisgICB0LmVuZExpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0RW5kTGluZSgpOworICAgdC5lbmRDb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7CisgICByZXR1cm4gdDsKK30KKworaW50IGN1ckxleFN0YXRlID0gMDsKK2ludCBkZWZhdWx0TGV4U3RhdGUgPSAwOworaW50IGpqbmV3U3RhdGVDbnQ7CitpbnQgampyb3VuZDsKK2ludCBqam1hdGNoZWRQb3M7CitpbnQgamptYXRjaGVkS2luZDsKKworcHVibGljIFRva2VuIGdldE5leHRUb2tlbigpIAoreworICBpbnQga2luZDsKKyAgVG9rZW4gc3BlY2lhbFRva2VuID0gbnVsbDsKKyAgVG9rZW4gbWF0Y2hlZFRva2VuOworICBpbnQgY3VyUG9zID0gMDsKKworICBFT0ZMb29wIDoKKyAgZm9yICg7OykKKyAgeyAgIAorICAgdHJ5ICAgCisgICB7ICAgICAKKyAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOworICAgfSAgICAgCisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCisgICB7ICAgICAgICAKKyAgICAgIGpqbWF0Y2hlZEtpbmQgPSAwOworICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKKyAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47CisgICB9CisKKyAgIGZvciAoOzspCisgICB7CisgICAgIHN3aXRjaChjdXJMZXhTdGF0ZSkKKyAgICAgeworICAgICAgIGNhc2UgMDoKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOworICAgICAgICAgamptYXRjaGVkUG9zID0gMDsKKyAgICAgICAgIGN1clBvcyA9IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgMToKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOworICAgICAgICAgamptYXRjaGVkUG9zID0gMDsKKyAgICAgICAgIGN1clBvcyA9IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzEoKTsKKyAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgPT0gMCAmJiBqam1hdGNoZWRLaW5kID4gNSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA1OworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgIH0KKyAgICAgaWYgKGpqbWF0Y2hlZEtpbmQgIT0gMHg3ZmZmZmZmZikKKyAgICAgeworICAgICAgICBpZiAoamptYXRjaGVkUG9zICsgMSA8IGN1clBvcykKKyAgICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cChjdXJQb3MgLSBqam1hdGNoZWRQb3MgLSAxKTsKKyAgICAgICAgaWYgKChqanRvVG9rZW5bamptYXRjaGVkS2luZCA+PiA2XSAmICgxTCA8PCAoamptYXRjaGVkS2luZCAmIDA3NykpKSAhPSAwTCkKKyAgICAgICAgeworICAgICAgICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOworICAgICAgIGlmIChqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdICE9IC0xKQorICAgICAgICAgY3VyTGV4U3RhdGUgPSBqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdOworICAgICAgICAgICByZXR1cm4gbWF0Y2hlZFRva2VuOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChqanRvU2tpcFtqam1hdGNoZWRLaW5kID4+IDZdICYgKDFMIDw8IChqam1hdGNoZWRLaW5kICYgMDc3KSkpICE9IDBMKQorICAgICAgICB7CisgICAgICAgICBpZiAoampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXSAhPSAtMSkKKyAgICAgICAgICAgY3VyTGV4U3RhdGUgPSBqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdOworICAgICAgICAgICBjb250aW51ZSBFT0ZMb29wOworICAgICAgICB9CisgICAgICBpZiAoampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXSAhPSAtMSkKKyAgICAgICAgY3VyTGV4U3RhdGUgPSBqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdOworICAgICAgICBjdXJQb3MgPSAwOworICAgICAgICBqam1hdGNoZWRLaW5kID0gMHg3ZmZmZmZmZjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOworICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlMSkgeyB9CisgICAgIH0KKyAgICAgaW50IGVycm9yX2xpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0RW5kTGluZSgpOworICAgICBpbnQgZXJyb3JfY29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOworICAgICBTdHJpbmcgZXJyb3JfYWZ0ZXIgPSBudWxsOworICAgICBib29sZWFuIEVPRlNlZW4gPSBmYWxzZTsKKyAgICAgdHJ5IHsgaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7IH0KKyAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZTEpIHsKKyAgICAgICAgRU9GU2VlbiA9IHRydWU7CisgICAgICAgIGVycm9yX2FmdGVyID0gY3VyUG9zIDw9IDEgPyAiIiA6IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpOworICAgICAgICBpZiAoY3VyQ2hhciA9PSAnXG4nIHx8IGN1ckNoYXIgPT0gJ1xyJykgeworICAgICAgICAgICBlcnJvcl9saW5lKys7CisgICAgICAgICAgIGVycm9yX2NvbHVtbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICBlcnJvcl9jb2x1bW4rKzsKKyAgICAgfQorICAgICBpZiAoIUVPRlNlZW4pIHsKKyAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsKKyAgICAgICAgZXJyb3JfYWZ0ZXIgPSBjdXJQb3MgPD0gMSA/ICIiIDogaW5wdXRfc3RyZWFtLkdldEltYWdlKCk7CisgICAgIH0KKyAgICAgdGhyb3cgbmV3IFRva2VuTWdyRXJyb3IoRU9GU2VlbiwgY3VyTGV4U3RhdGUsIGVycm9yX2xpbmUsIGVycm9yX2NvbHVtbiwgZXJyb3JfYWZ0ZXIsIGN1ckNoYXIsIFRva2VuTWdyRXJyb3IuTEVYSUNBTF9FUlJPUik7CisgICB9CisgIH0KK30KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvamF2YWNjUGFyc2VyL0V4dEVtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL2phdmFjY1BhcnNlci9FeHRFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhMjE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL2phdmFjY1BhcnNlci9FeHRFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwOS4wMi4yMDA3IDEzOjAzOjA1CisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLnBhcnNlcjsKKworcHVibGljIGNsYXNzIEV4dEVtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIgZXh0ZW5kcyBFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyIHsKKworCXByaXZhdGUgZmluYWwgRXh0U2ltcGxlQ2hhclN0cmVhbSBfc3RyZWFtOworCQorCXB1YmxpYyBFeHRFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyKEV4dFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtKSB7CisJCXN1cGVyKHN0cmVhbSk7CisJCV9zdHJlYW0gPSBzdHJlYW07CisJfQorCisJcHJvdGVjdGVkIFRva2VuIGpqRmlsbFRva2VuKCkgeworCQlFeHRUb2tlbiB0ID0gbmV3IEV4dFRva2VuKCk7CisJCXQua2luZCA9IGpqbWF0Y2hlZEtpbmQ7CisJCVN0cmluZyBpbSA9IGpqc3RyTGl0ZXJhbEltYWdlc1tqam1hdGNoZWRLaW5kXTsKKwkJdC5pbWFnZSA9IChpbSA9PSBudWxsKSA/IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpIDogaW07CisJCXQuYmVnaW5MaW5lID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luTGluZSgpOworCQl0LmJlZ2luQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luQ29sdW1uKCk7CisJCXQuZW5kTGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7CisJCXQuZW5kQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOworCQl0LnRva2VuT2Zmc2V0ID0gX3N0cmVhbS50b2tlbkJlZ2luT2Zmc2V0OworCQlyZXR1cm4gdDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL2phdmFjY1BhcnNlci9FeHRTaW1wbGVDaGFyU3RyZWFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvRXh0U2ltcGxlQ2hhclN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDk0YTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvRXh0U2ltcGxlQ2hhclN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDkuMDIuMjAwNyAxMzowMzowNQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CisKK3B1YmxpYyBjbGFzcyBFeHRTaW1wbGVDaGFyU3RyZWFtIGV4dGVuZHMgU2ltcGxlQ2hhclN0cmVhbSB7CisKKwkvKioKKwkgKiBUaGUgY3VycmVudCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gdGhlIGlucHV0IHN0cmVhbS4KKwkgKi8KKwlwdWJsaWMgaW50IGlucHV0T2Zmc2V0ID0gLTE7CisJCisJLyoqCisJICogVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHRva2VuIGluIHRoZSBpbnB1dCBzdHJlYW0uCisJICovCisJcHVibGljIGludCB0b2tlbkJlZ2luT2Zmc2V0OworCQorCQorCXB1YmxpYyBFeHRTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0pIHsKKwkJc3VwZXIoZHN0cmVhbSk7CisJfQorCQorCXB1YmxpYyBjaGFyIEJlZ2luVG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisJCXRva2VuQmVnaW4gPSAtMTsKKwkJdG9rZW5CZWdpbk9mZnNldCA9IC0xOworCQkKKwkJY2hhciBjID0gcmVhZENoYXIoKTsKKwkJCisJCXRva2VuQmVnaW4gPSBidWZwb3M7CisJCXRva2VuQmVnaW5PZmZzZXQgPSBpbnB1dE9mZnNldDsKKworCQlyZXR1cm4gYzsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgVXBkYXRlTGluZUNvbHVtbihjaGFyIGMpIHsKKwkJaW5wdXRPZmZzZXQrKzsKKwkJc3VwZXIuVXBkYXRlTGluZUNvbHVtbihjKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvRXh0VG9rZW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL2phdmFjY1BhcnNlci9FeHRUb2tlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjU0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvRXh0VG9rZW4uamF2YQpAQCAtMCwwICsxLDE0IEBACisvKioKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA5LjAyLjIwMDcgMTM6MDM6MDUKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4ucGFyc2VyOworCitwdWJsaWMgY2xhc3MgRXh0VG9rZW4gZXh0ZW5kcyBUb2tlbiB7CisKKwkvKioKKwkgKiBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHRva2VuIGluIHRoZSBpbnB1dCBzdHJlYW0uCisJICovCisJcHVibGljIGludCB0b2tlbk9mZnNldDsKKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvamF2YWNjUGFyc2VyL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvUGFyc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTQzNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvamF2YWNjUGFyc2VyL1BhcnNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUGFyc2VFeGNlcHRpb24uamF2YSBWZXJzaW9uIDMuMCAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLnBhcnNlcjsKKworLyoqCisgKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBwYXJzZSBlcnJvcnMgYXJlIGVuY291bnRlcmVkLgorICogWW91IGNhbiBleHBsaWNpdGx5IGNyZWF0ZSBvYmplY3RzIG9mIHRoaXMgZXhjZXB0aW9uIHR5cGUgYnkKKyAqIGNhbGxpbmcgdGhlIG1ldGhvZCBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIGluIHRoZSBnZW5lcmF0ZWQKKyAqIHBhcnNlci4KKyAqCisgKiBZb3UgY2FuIG1vZGlmeSB0aGlzIGNsYXNzIHRvIGN1c3RvbWl6ZSB5b3VyIGVycm9yIHJlcG9ydGluZworICogbWVjaGFuaXNtcyBzbyBsb25nIGFzIHlvdSByZXRhaW4gdGhlIHB1YmxpYyBmaWVsZHMuCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgLyoqCisgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgbWV0aG9kICJnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIgorICAgKiBpbiB0aGUgZ2VuZXJhdGVkIHBhcnNlci4gIENhbGxpbmcgdGhpcyBjb25zdHJ1Y3RvciBnZW5lcmF0ZXMKKyAgICogYSBuZXcgb2JqZWN0IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBmaWVsZHMgImN1cnJlbnRUb2tlbiIsCisgICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBzZXQuICBUaGUgYm9vbGVhbgorICAgKiBmbGFnICJzcGVjaWFsQ29uc3RydWN0b3IiIGlzIGFsc28gc2V0IHRvIHRydWUgdG8gaW5kaWNhdGUgdGhhdAorICAgKiB0aGlzIGNvbnN0cnVjdG9yIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIG9iamVjdC4KKyAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBpdHMgc3VwZXIgY2xhc3Mgd2l0aCB0aGUgZW1wdHkgc3RyaW5nCisgICAqIHRvIGZvcmNlIHRoZSAidG9TdHJpbmciIG1ldGhvZCBvZiBwYXJlbnQgY2xhc3MgIlRocm93YWJsZSIgdG8KKyAgICogcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGZvcm06CisgICAqICAgICBQYXJzZUV4Y2VwdGlvbjogPHJlc3VsdCBvZiBnZXRNZXNzYWdlPgorICAgKi8KKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFRva2VuIGN1cnJlbnRUb2tlblZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRva2VuSW1hZ2VWYWwKKyAgICAgICAgICAgICAgICAgICAgICAgKQorICB7CisgICAgc3VwZXIoIiIpOworICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IHRydWU7CisgICAgY3VycmVudFRva2VuID0gY3VycmVudFRva2VuVmFsOworICAgIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsOworICAgIHRva2VuSW1hZ2UgPSB0b2tlbkltYWdlVmFsOworICB9CisKKyAgLyoqCisgICAqIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3JzIGFyZSBmb3IgdXNlIGJ5IHlvdSBmb3Igd2hhdGV2ZXIKKyAgICogcHVycG9zZSB5b3UgY2FuIHRoaW5rIG9mLiAgQ29uc3RydWN0aW5nIHRoZSBleGNlcHRpb24gaW4gdGhpcworICAgKiBtYW5uZXIgbWFrZXMgdGhlIGV4Y2VwdGlvbiBiZWhhdmUgaW4gdGhlIG5vcm1hbCB3YXkgLSBpLmUuLCBhcworICAgKiBkb2N1bWVudGVkIGluIHRoZSBjbGFzcyAiVGhyb3dhYmxlIi4gIFRoZSBmaWVsZHMgImVycm9yVG9rZW4iLAorICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgZG8gbm90IGNvbnRhaW4KKyAgICogcmVsZXZhbnQgaW5mb3JtYXRpb24uICBUaGUgSmF2YUNDIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHVzZQorICAgKiB0aGVzZSBjb25zdHJ1Y3RvcnMuCisgICAqLworCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigpOworICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOworICB9CisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogVGhpcyB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoaWNoIGNvbnN0cnVjdG9yIHdhcyB1c2VkIHRvIGNyZWF0ZQorICAgKiB0aGlzIG9iamVjdCBhbmQgdGhlcmVieSBhZmZlY3RzIHRoZSBzZW1hbnRpY3Mgb2YgdGhlCisgICAqICJnZXRNZXNzYWdlIiBtZXRob2QgKHNlZSBiZWxvdykuCisgICAqLworICBwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWFsQ29uc3RydWN0b3I7CisKKyAgLyoqCisgICAqIFRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gdGhhdCBoYXMgYmVlbiBjb25zdW1lZCBzdWNjZXNzZnVsbHkuICBJZgorICAgKiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkIGR1ZSB0byBhIHBhcnNlIGVycm9yLCB0aGUgdG9rZW4KKyAgICogZm9sbG93bmcgdGhpcyB0b2tlbiB3aWxsICh0aGVyZWZvcmUpIGJlIHRoZSBmaXJzdCBlcnJvciB0b2tlbi4KKyAgICovCisgIHB1YmxpYyBUb2tlbiBjdXJyZW50VG9rZW47CisKKyAgLyoqCisgICAqIEVhY2ggZW50cnkgaW4gdGhpcyBhcnJheSBpcyBhbiBhcnJheSBvZiBpbnRlZ2Vycy4gIEVhY2ggYXJyYXkKKyAgICogb2YgaW50ZWdlcnMgcmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIHRva2VucyAoYnkgdGhlaXIgb3JkaW5hbAorICAgKiB2YWx1ZXMpIHRoYXQgaXMgZXhwZWN0ZWQgYXQgdGhpcyBwb2ludCBvZiB0aGUgcGFyc2UuCisgICAqLworICBwdWJsaWMgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzOworCisgIC8qKgorICAgKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSAidG9rZW5JbWFnZSIgYXJyYXkgb2YgdGhlIGdlbmVyYXRlZAorICAgKiBwYXJzZXIgd2l0aGluIHdoaWNoIHRoZSBwYXJzZSBlcnJvciBvY2N1cnJlZC4gIFRoaXMgYXJyYXkgaXMKKyAgICogZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIC4uLkNvbnN0YW50cyBpbnRlcmZhY2UuCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gdG9rZW5JbWFnZTsKKworICAvKioKKyAgICogVGhpcyBtZXRob2QgaGFzIHRoZSBzdGFuZGFyZCBiZWhhdmlvciB3aGVuIHRoaXMgb2JqZWN0IGhhcyBiZWVuCisgICAqIGNyZWF0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGNvbnN0cnVjdG9ycy4gIE90aGVyd2lzZSwgaXQgdXNlcworICAgKiAiY3VycmVudFRva2VuIiBhbmQgImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiIHRvIGdlbmVyYXRlIGEgcGFyc2UKKyAgICogZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJucyBpdC4gIElmIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQKKyAgICogZHVlIHRvIGEgcGFyc2UgZXJyb3IsIGFuZCB5b3UgZG8gbm90IGNhdGNoIGl0IChpdCBnZXRzIHRocm93bgorICAgKiBmcm9tIHRoZSBwYXJzZXIpLCB0aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgdGhlIHByaW50aW5nCisgICAqIG9mIHRoZSBmaW5hbCBzdGFjayB0cmFjZSwgYW5kIGhlbmNlIHRoZSBjb3JyZWN0IGVycm9yIG1lc3NhZ2UKKyAgICogZ2V0cyBkaXNwbGF5ZWQuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgaWYgKCFzcGVjaWFsQ29uc3RydWN0b3IpIHsKKyAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7CisgICAgfQorICAgIFN0cmluZ0J1ZmZlciBleHBlY3RlZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBpbnQgbWF4U2l6ZSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAobWF4U2l6ZSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoKSB7CisgICAgICAgIG1heFNpemUgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7IGorKykgeworICAgICAgICBleHBlY3RlZC5hcHBlbmQodG9rZW5JbWFnZVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2pdXSkuYXBwZW5kKCIgIik7CisgICAgICB9CisgICAgICBpZiAoZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aCAtIDFdICE9IDApIHsKKyAgICAgICAgZXhwZWN0ZWQuYXBwZW5kKCIuLi4iKTsKKyAgICAgIH0KKyAgICAgIGV4cGVjdGVkLmFwcGVuZChlb2wpLmFwcGVuZCgiICAgICIpOworICAgIH0KKyAgICBTdHJpbmcgcmV0dmFsID0gIkVuY291bnRlcmVkIFwiIjsKKyAgICBUb2tlbiB0b2sgPSBjdXJyZW50VG9rZW4ubmV4dDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFNpemU7IGkrKykgeworICAgICAgaWYgKGkgIT0gMCkgcmV0dmFsICs9ICIgIjsKKyAgICAgIGlmICh0b2sua2luZCA9PSAwKSB7CisgICAgICAgIHJldHZhbCArPSB0b2tlbkltYWdlWzBdOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJldHZhbCArPSBhZGRfZXNjYXBlcyh0b2suaW1hZ2UpOworICAgICAgdG9rID0gdG9rLm5leHQ7IAorICAgIH0KKyAgICByZXR2YWwgKz0gIlwiIGF0IGxpbmUgIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luTGluZSArICIsIGNvbHVtbiAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5Db2x1bW47CisgICAgcmV0dmFsICs9ICIuIiArIGVvbDsKKyAgICBpZiAoZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGggPT0gMSkgeworICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nOiIgKyBlb2wgKyAiICAgICI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZyBvbmUgb2Y6IiArIGVvbCArICIgICAgIjsKKyAgICB9CisgICAgcmV0dmFsICs9IGV4cGVjdGVkLnRvU3RyaW5nKCk7CisgICAgcmV0dXJuIHJldHZhbDsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZW5kIG9mIGxpbmUgc3RyaW5nIGZvciB0aGlzIG1hY2hpbmUuCisgICAqLworICBwcm90ZWN0ZWQgU3RyaW5nIGVvbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsKKyAKKyAgLyoqCisgICAqIFVzZWQgdG8gY29udmVydCByYXcgY2hhcmFjdGVycyB0byB0aGVpciBlc2NhcGVkIHZlcnNpb24KKyAgICogd2hlbiB0aGVzZSByYXcgdmVyc2lvbiBjYW5ub3QgYmUgdXNlZCBhcyBwYXJ0IG9mIGFuIEFTQ0lJCisgICAqIHN0cmluZyBsaXRlcmFsLgorICAgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBhZGRfZXNjYXBlcyhTdHJpbmcgc3RyKSB7CisgICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgY2hhciBjaDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQorICAgICAgICB7CisgICAgICAgICAgIGNhc2UgMCA6CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcYic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmICgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjAgfHwgY2ggPiAweDdlKSB7CisgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOworICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKKyAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvamF2YWNjUGFyc2VyL1NpbXBsZUNoYXJTdHJlYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL2phdmFjY1BhcnNlci9TaW1wbGVDaGFyU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFlNTgxNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL2phdmFjY1BhcnNlci9TaW1wbGVDaGFyU3RyZWFtLmphdmEKQEAgLTAsMCArMSw0MzkgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2ltcGxlQ2hhclN0cmVhbS5qYXZhIFZlcnNpb24gNC4wICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4ucGFyc2VyOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZSBDaGFyU3RyZWFtLCB3aGVyZSB0aGUgc3RyZWFtIGlzIGFzc3VtZWQgdG8KKyAqIGNvbnRhaW4gb25seSBBU0NJSSBjaGFyYWN0ZXJzICh3aXRob3V0IHVuaWNvZGUgcHJvY2Vzc2luZykuCisgKi8KKworcHVibGljIGNsYXNzIFNpbXBsZUNoYXJTdHJlYW0KK3sKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHN0YXRpY0ZsYWcgPSBmYWxzZTsKKyAgaW50IGJ1ZnNpemU7CisgIGludCBhdmFpbGFibGU7CisgIGludCB0b2tlbkJlZ2luOworICBwdWJsaWMgaW50IGJ1ZnBvcyA9IC0xOworICBwcm90ZWN0ZWQgaW50IGJ1ZmxpbmVbXTsKKyAgcHJvdGVjdGVkIGludCBidWZjb2x1bW5bXTsKKworICBwcm90ZWN0ZWQgaW50IGNvbHVtbiA9IDA7CisgIHByb3RlY3RlZCBpbnQgbGluZSA9IDE7CisKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0NSID0gZmFsc2U7CisgIHByb3RlY3RlZCBib29sZWFuIHByZXZDaGFySXNMRiA9IGZhbHNlOworCisgIHByb3RlY3RlZCBqYXZhLmlvLlJlYWRlciBpbnB1dFN0cmVhbTsKKworICBwcm90ZWN0ZWQgY2hhcltdIGJ1ZmZlcjsKKyAgcHJvdGVjdGVkIGludCBtYXhOZXh0Q2hhckluZCA9IDA7CisgIHByb3RlY3RlZCBpbnQgaW5CdWYgPSAwOworICBwcm90ZWN0ZWQgaW50IHRhYlNpemUgPSA4OworCisgIHByb3RlY3RlZCB2b2lkIHNldFRhYlNpemUoaW50IGkpIHsgdGFiU2l6ZSA9IGk7IH0KKyAgcHJvdGVjdGVkIGludCBnZXRUYWJTaXplKGludCBpKSB7IHJldHVybiB0YWJTaXplOyB9CisKKworICBwcm90ZWN0ZWQgdm9pZCBFeHBhbmRCdWZmKGJvb2xlYW4gd3JhcEFyb3VuZCkKKyAgeworICAgICBjaGFyW10gbmV3YnVmZmVyID0gbmV3IGNoYXJbYnVmc2l6ZSArIDIwNDhdOworICAgICBpbnQgbmV3YnVmbGluZVtdID0gbmV3IGludFtidWZzaXplICsgMjA0OF07CisgICAgIGludCBuZXdidWZjb2x1bW5bXSA9IG5ldyBpbnRbYnVmc2l6ZSArIDIwNDhdOworCisgICAgIHRyeQorICAgICB7CisgICAgICAgIGlmICh3cmFwQXJvdW5kKQorICAgICAgICB7CisgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0b2tlbkJlZ2luLCBuZXdidWZmZXIsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIG5ld2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOworICAgICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7CisKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7CisgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgMCwgbmV3YnVmbGluZSwgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7CisgICAgICAgICAgIGJ1ZmxpbmUgPSBuZXdidWZsaW5lOworCisgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCB0b2tlbkJlZ2luLCBuZXdidWZjb2x1bW4sIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIDAsIG5ld2J1ZmNvbHVtbiwgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7CisgICAgICAgICAgIGJ1ZmNvbHVtbiA9IG5ld2J1ZmNvbHVtbjsKKworICAgICAgICAgICBtYXhOZXh0Q2hhckluZCA9IChidWZwb3MgKz0gKGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0b2tlbkJlZ2luLCBuZXdidWZmZXIsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKKyAgICAgICAgICAgYnVmZmVyID0gbmV3YnVmZmVyOworCisgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgdG9rZW5CZWdpbiwgbmV3YnVmbGluZSwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICAgICBidWZsaW5lID0gbmV3YnVmbGluZTsKKworICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgdG9rZW5CZWdpbiwgbmV3YnVmY29sdW1uLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7CisgICAgICAgICAgIGJ1ZmNvbHVtbiA9IG5ld2J1ZmNvbHVtbjsKKworICAgICAgICAgICBtYXhOZXh0Q2hhckluZCA9IChidWZwb3MgLT0gdG9rZW5CZWdpbik7CisgICAgICAgIH0KKyAgICAgfQorICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgfQorCisKKyAgICAgYnVmc2l6ZSArPSAyMDQ4OworICAgICBhdmFpbGFibGUgPSBidWZzaXplOworICAgICB0b2tlbkJlZ2luID0gMDsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIEZpbGxCdWZmKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgeworICAgICBpZiAobWF4TmV4dENoYXJJbmQgPT0gYXZhaWxhYmxlKQorICAgICB7CisgICAgICAgIGlmIChhdmFpbGFibGUgPT0gYnVmc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICBpZiAodG9rZW5CZWdpbiA+IDIwNDgpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnVmcG9zID0gbWF4TmV4dENoYXJJbmQgPSAwOworICAgICAgICAgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgaWYgKHRva2VuQmVnaW4gPCAwKQorICAgICAgICAgICAgICBidWZwb3MgPSBtYXhOZXh0Q2hhckluZCA9IDA7CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgRXhwYW5kQnVmZihmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXZhaWxhYmxlID4gdG9rZW5CZWdpbikKKyAgICAgICAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZTsKKyAgICAgICAgZWxzZSBpZiAoKHRva2VuQmVnaW4gLSBhdmFpbGFibGUpIDwgMjA0OCkKKyAgICAgICAgICAgRXhwYW5kQnVmZih0cnVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOworICAgICB9CisKKyAgICAgaW50IGk7CisgICAgIHRyeSB7CisgICAgICAgIGlmICgoaSA9IGlucHV0U3RyZWFtLnJlYWQoYnVmZmVyLCBtYXhOZXh0Q2hhckluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSAtIG1heE5leHRDaGFySW5kKSkgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgIG1heE5leHRDaGFySW5kICs9IGk7CisgICAgICAgIHJldHVybjsKKyAgICAgfQorICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLS1idWZwb3M7CisgICAgICAgIGJhY2t1cCgwKTsKKyAgICAgICAgaWYgKHRva2VuQmVnaW4gPT0gLTEpCisgICAgICAgICAgIHRva2VuQmVnaW4gPSBidWZwb3M7CisgICAgICAgIHRocm93IGU7CisgICAgIH0KKyAgfQorCisgIHB1YmxpYyBjaGFyIEJlZ2luVG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICB7CisgICAgIHRva2VuQmVnaW4gPSAtMTsKKyAgICAgY2hhciBjID0gcmVhZENoYXIoKTsKKyAgICAgdG9rZW5CZWdpbiA9IGJ1ZnBvczsKKworICAgICByZXR1cm4gYzsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIFVwZGF0ZUxpbmVDb2x1bW4oY2hhciBjKQorICB7CisgICAgIGNvbHVtbisrOworCisgICAgIGlmIChwcmV2Q2hhcklzTEYpCisgICAgIHsKKyAgICAgICAgcHJldkNoYXJJc0xGID0gZmFsc2U7CisgICAgICAgIGxpbmUgKz0gKGNvbHVtbiA9IDEpOworICAgICB9CisgICAgIGVsc2UgaWYgKHByZXZDaGFySXNDUikKKyAgICAgeworICAgICAgICBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKKyAgICAgICAgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgeworICAgICAgICAgICBwcmV2Q2hhcklzTEYgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7CisgICAgIH0KKworICAgICBzd2l0Y2ggKGMpCisgICAgIHsKKyAgICAgICAgY2FzZSAnXHInIDoKKyAgICAgICAgICAgcHJldkNoYXJJc0NSID0gdHJ1ZTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xuJyA6CisgICAgICAgICAgIHByZXZDaGFySXNMRiA9IHRydWU7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcdCcgOgorICAgICAgICAgICBjb2x1bW4tLTsKKyAgICAgICAgICAgY29sdW1uICs9ICh0YWJTaXplIC0gKGNvbHVtbiAlIHRhYlNpemUpKTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICBicmVhazsKKyAgICAgfQorCisgICAgIGJ1ZmxpbmVbYnVmcG9zXSA9IGxpbmU7CisgICAgIGJ1ZmNvbHVtbltidWZwb3NdID0gY29sdW1uOworICB9CisKKyAgcHVibGljIGNoYXIgcmVhZENoYXIoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICB7CisgICAgIGlmIChpbkJ1ZiA+IDApCisgICAgIHsKKyAgICAgICAgLS1pbkJ1ZjsKKworICAgICAgICBpZiAoKytidWZwb3MgPT0gYnVmc2l6ZSkKKyAgICAgICAgICAgYnVmcG9zID0gMDsKKworICAgICAgICByZXR1cm4gYnVmZmVyW2J1ZnBvc107CisgICAgIH0KKworICAgICBpZiAoKytidWZwb3MgPj0gbWF4TmV4dENoYXJJbmQpCisgICAgICAgIEZpbGxCdWZmKCk7CisKKyAgICAgY2hhciBjID0gYnVmZmVyW2J1ZnBvc107CisKKyAgICAgVXBkYXRlTGluZUNvbHVtbihjKTsKKyAgICAgcmV0dXJuIChjKTsKKyAgfQorCisgIC8qKgorICAgKiBAZGVwcmVjYXRlZCAKKyAgICogQHNlZSAjZ2V0RW5kQ29sdW1uCisgICAqLworCisgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkgeworICAgICByZXR1cm4gYnVmY29sdW1uW2J1ZnBvc107CisgIH0KKworICAvKioKKyAgICogQGRlcHJlY2F0ZWQgCisgICAqIEBzZWUgI2dldEVuZExpbmUKKyAgICovCisKKyAgcHVibGljIGludCBnZXRMaW5lKCkgeworICAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOworICB9CisKKyAgcHVibGljIGludCBnZXRFbmRDb2x1bW4oKSB7CisgICAgIHJldHVybiBidWZjb2x1bW5bYnVmcG9zXTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0RW5kTGluZSgpIHsKKyAgICAgcmV0dXJuIGJ1ZmxpbmVbYnVmcG9zXTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0QmVnaW5Db2x1bW4oKSB7CisgICAgIHJldHVybiBidWZjb2x1bW5bdG9rZW5CZWdpbl07CisgIH0KKworICBwdWJsaWMgaW50IGdldEJlZ2luTGluZSgpIHsKKyAgICAgcmV0dXJuIGJ1ZmxpbmVbdG9rZW5CZWdpbl07CisgIH0KKworICBwdWJsaWMgdm9pZCBiYWNrdXAoaW50IGFtb3VudCkgeworCisgICAgaW5CdWYgKz0gYW1vdW50OworICAgIGlmICgoYnVmcG9zIC09IGFtb3VudCkgPCAwKQorICAgICAgIGJ1ZnBvcyArPSBidWZzaXplOworICB9CisKKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKKyAgeworICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKKyAgICBsaW5lID0gc3RhcnRsaW5lOworICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKKworICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemUgPSBidWZmZXJzaXplOworICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOworICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOworICAgIGJ1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07CisgIH0KKworICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCisgIHsKKyAgICAgdGhpcyhkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKKyAgfQorCisgIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0pCisgIHsKKyAgICAgdGhpcyhkc3RyZWFtLCAxLCAxLCA0MDk2KTsKKyAgfQorICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKKyAgeworICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKKyAgICBsaW5lID0gc3RhcnRsaW5lOworICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKKworICAgIGlmIChidWZmZXIgPT0gbnVsbCB8fCBidWZmZXJzaXplICE9IGJ1ZmZlci5sZW5ndGgpCisgICAgeworICAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7CisgICAgICBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJzaXplXTsKKyAgICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOworICAgICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKKyAgICB9CisgICAgcHJldkNoYXJJc0xGID0gcHJldkNoYXJJc0NSID0gZmFsc2U7CisgICAgdG9rZW5CZWdpbiA9IGluQnVmID0gbWF4TmV4dENoYXJJbmQgPSAwOworICAgIGJ1ZnBvcyA9IC0xOworICB9CisKKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCisgIHsKKyAgICAgUmVJbml0KGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOworICB9CisKKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0pCisgIHsKKyAgICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOworICB9CisgIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLCBpbnQgc3RhcnRsaW5lLAorICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICAgdGhpcyhlbmNvZGluZyA9PSBudWxsID8gbmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSkgOiBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtLCBlbmNvZGluZyksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOworICB9CisKKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQorICB7CisgICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOworICB9CisKKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcsIGludCBzdGFydGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICB7CisgICAgIHRoaXMoZHN0cmVhbSwgZW5jb2RpbmcsIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOworICB9CisKKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCisgIHsKKyAgICAgdGhpcyhkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKKyAgfQorCisgIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICAgdGhpcyhkc3RyZWFtLCBlbmNvZGluZywgMSwgMSwgNDA5Nik7CisgIH0KKworICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0pCisgIHsKKyAgICAgdGhpcyhkc3RyZWFtLCAxLCAxLCA0MDk2KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICB7CisgICAgIFJlSW5pdChlbmNvZGluZyA9PSBudWxsID8gbmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSkgOiBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtLCBlbmNvZGluZyksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKKyAgeworICAgICBSZUluaXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICAgUmVJbml0KGRzdHJlYW0sIGVuY29kaW5nLCAxLCAxLCA0MDk2KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0pCisgIHsKKyAgICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOworICB9CisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICB7CisgICAgIFJlSW5pdChkc3RyZWFtLCBlbmNvZGluZywgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7CisgIH0KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKKyAgeworICAgICBSZUluaXQoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7CisgIH0KKyAgcHVibGljIFN0cmluZyBHZXRJbWFnZSgpCisgIHsKKyAgICAgaWYgKGJ1ZnBvcyA+PSB0b2tlbkJlZ2luKQorICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnBvcyAtIHRva2VuQmVnaW4gKyAxKTsKKyAgICAgZWxzZQorICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgYnVmcG9zICsgMSk7CisgIH0KKworICBwdWJsaWMgY2hhcltdIEdldFN1ZmZpeChpbnQgbGVuKQorICB7CisgICAgIGNoYXJbXSByZXQgPSBuZXcgY2hhcltsZW5dOworCisgICAgIGlmICgoYnVmcG9zICsgMSkgPj0gbGVuKQorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmcG9zIC0gbGVuICsgMSwgcmV0LCAwLCBsZW4pOworICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZnNpemUgLSAobGVuIC0gYnVmcG9zIC0gMSksIHJldCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBidWZwb3MgLSAxKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIHJldCwgbGVuIC0gYnVmcG9zIC0gMSwgYnVmcG9zICsgMSk7CisgICAgIH0KKworICAgICByZXR1cm4gcmV0OworICB9CisKKyAgcHVibGljIHZvaWQgRG9uZSgpCisgIHsKKyAgICAgYnVmZmVyID0gbnVsbDsKKyAgICAgYnVmbGluZSA9IG51bGw7CisgICAgIGJ1ZmNvbHVtbiA9IG51bGw7CisgIH0KKworICAvKioKKyAgICogTWV0aG9kIHRvIGFkanVzdCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBmb3IgdGhlIHN0YXJ0IG9mIGEgdG9rZW4uCisgICAqLworICBwdWJsaWMgdm9pZCBhZGp1c3RCZWdpbkxpbmVDb2x1bW4oaW50IG5ld0xpbmUsIGludCBuZXdDb2wpCisgIHsKKyAgICAgaW50IHN0YXJ0ID0gdG9rZW5CZWdpbjsKKyAgICAgaW50IGxlbjsKKworICAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCisgICAgIHsKKyAgICAgICAgbGVuID0gYnVmcG9zIC0gdG9rZW5CZWdpbiArIGluQnVmICsgMTsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgbGVuID0gYnVmc2l6ZSAtIHRva2VuQmVnaW4gKyBidWZwb3MgKyAxICsgaW5CdWY7CisgICAgIH0KKworICAgICBpbnQgaSA9IDAsIGogPSAwLCBrID0gMDsKKyAgICAgaW50IG5leHRDb2xEaWZmID0gMCwgY29sdW1uRGlmZiA9IDA7CisKKyAgICAgd2hpbGUgKGkgPCBsZW4gJiYKKyAgICAgICAgICAgIGJ1ZmxpbmVbaiA9IHN0YXJ0ICUgYnVmc2l6ZV0gPT0gYnVmbGluZVtrID0gKytzdGFydCAlIGJ1ZnNpemVdKQorICAgICB7CisgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOworICAgICAgICBuZXh0Q29sRGlmZiA9IGNvbHVtbkRpZmYgKyBidWZjb2x1bW5ba10gLSBidWZjb2x1bW5bal07CisgICAgICAgIGJ1ZmNvbHVtbltqXSA9IG5ld0NvbCArIGNvbHVtbkRpZmY7CisgICAgICAgIGNvbHVtbkRpZmYgPSBuZXh0Q29sRGlmZjsKKyAgICAgICAgaSsrOworICAgICB9IAorCisgICAgIGlmIChpIDwgbGVuKQorICAgICB7CisgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lKys7CisgICAgICAgIGJ1ZmNvbHVtbltqXSA9IG5ld0NvbCArIGNvbHVtbkRpZmY7CisKKyAgICAgICAgd2hpbGUgKGkrKyA8IGxlbikKKyAgICAgICAgeworICAgICAgICAgICBpZiAoYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSAhPSBidWZsaW5lWysrc3RhcnQgJSBidWZzaXplXSkKKyAgICAgICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmUrKzsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZTsKKyAgICAgICAgfQorICAgICB9CisKKyAgICAgbGluZSA9IGJ1ZmxpbmVbal07CisgICAgIGNvbHVtbiA9IGJ1ZmNvbHVtbltqXTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvVG9rZW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9ncmFtbWFyL2phdmFjY1BhcnNlci9Ub2tlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYjIzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvVG9rZW4uamF2YQpAQCAtMCwwICsxLDgxIEBACisvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFRva2VuLmphdmEgVmVyc2lvbiAzLjAgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBpbnB1dCB0b2tlbiBzdHJlYW0uCisgKi8KKworcHVibGljIGNsYXNzIFRva2VuIHsKKworICAvKioKKyAgICogQW4gaW50ZWdlciB0aGF0IGRlc2NyaWJlcyB0aGUga2luZCBvZiB0aGlzIHRva2VuLiAgVGhpcyBudW1iZXJpbmcKKyAgICogc3lzdGVtIGlzIGRldGVybWluZWQgYnkgSmF2YUNDUGFyc2VyLCBhbmQgYSB0YWJsZSBvZiB0aGVzZSBudW1iZXJzIGlzCisgICAqIHN0b3JlZCBpbiB0aGUgZmlsZSAuLi5Db25zdGFudHMuamF2YS4KKyAgICovCisgIHB1YmxpYyBpbnQga2luZDsKKworICAvKioKKyAgICogYmVnaW5MaW5lIGFuZCBiZWdpbkNvbHVtbiBkZXNjcmliZSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgKiBvZiB0aGlzIHRva2VuOyBlbmRMaW5lIGFuZCBlbmRDb2x1bW4gZGVzY3JpYmUgdGhlIHBvc2l0aW9uIG9mIHRoZQorICAgKiBsYXN0IGNoYXJhY3RlciBvZiB0aGlzIHRva2VuLgorICAgKi8KKyAgcHVibGljIGludCBiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW47CisKKyAgLyoqCisgICAqIFRoZSBzdHJpbmcgaW1hZ2Ugb2YgdGhlIHRva2VuLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBpbWFnZTsKKworICAvKioKKyAgICogQSByZWZlcmVuY2UgdG8gdGhlIG5leHQgcmVndWxhciAobm9uLXNwZWNpYWwpIHRva2VuIGZyb20gdGhlIGlucHV0CisgICAqIHN0cmVhbS4gIElmIHRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBvciBpZiB0aGUKKyAgICogdG9rZW4gbWFuYWdlciBoYXMgbm90IHJlYWQgdG9rZW5zIGJleW9uZCB0aGlzIG9uZSwgdGhpcyBmaWVsZCBpcworICAgKiBzZXQgdG8gbnVsbC4gIFRoaXMgaXMgdHJ1ZSBvbmx5IGlmIHRoaXMgdG9rZW4gaXMgYWxzbyBhIHJlZ3VsYXIKKyAgICogdG9rZW4uICBPdGhlcndpc2UsIHNlZSBiZWxvdyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29udGVudHMgb2YKKyAgICogdGhpcyBmaWVsZC4KKyAgICovCisgIHB1YmxpYyBUb2tlbiBuZXh0OworCisgIC8qKgorICAgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gYWNjZXNzIHNwZWNpYWwgdG9rZW5zIHRoYXQgb2NjdXIgcHJpb3IgdG8gdGhpcworICAgKiB0b2tlbiwgYnV0IGFmdGVyIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgcmVndWxhciAobm9uLXNwZWNpYWwpIHRva2VuLgorICAgKiBJZiB0aGVyZSBhcmUgbm8gc3VjaCBzcGVjaWFsIHRva2VucywgdGhpcyBmaWVsZCBpcyBzZXQgdG8gbnVsbC4KKyAgICogV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBzdWNoIHNwZWNpYWwgdG9rZW4sIHRoaXMgZmllbGQgcmVmZXJzCisgICAqIHRvIHRoZSBsYXN0IG9mIHRoZXNlIHNwZWNpYWwgdG9rZW5zLCB3aGljaCBpbiB0dXJuIHJlZmVycyB0byB0aGUgbmV4dAorICAgKiBwcmV2aW91cyBzcGVjaWFsIHRva2VuIHRocm91Z2ggaXRzIHNwZWNpYWxUb2tlbiBmaWVsZCwgYW5kIHNvIG9uCisgICAqIHVudGlsIHRoZSBmaXJzdCBzcGVjaWFsIHRva2VuICh3aG9zZSBzcGVjaWFsVG9rZW4gZmllbGQgaXMgbnVsbCkuCisgICAqIFRoZSBuZXh0IGZpZWxkcyBvZiBzcGVjaWFsIHRva2VucyByZWZlciB0byBvdGhlciBzcGVjaWFsIHRva2VucyB0aGF0CisgICAqIGltbWVkaWF0ZWx5IGZvbGxvdyBpdCAod2l0aG91dCBhbiBpbnRlcnZlbmluZyByZWd1bGFyIHRva2VuKS4gIElmIHRoZXJlCisgICAqIGlzIG5vIHN1Y2ggdG9rZW4sIHRoaXMgZmllbGQgaXMgbnVsbC4KKyAgICovCisgIHB1YmxpYyBUb2tlbiBzcGVjaWFsVG9rZW47CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGltYWdlLgorICAgKi8KKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgIHsKKyAgICAgcmV0dXJuIGltYWdlOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgYSBuZXcgVG9rZW4gb2JqZWN0LCBieSBkZWZhdWx0LiBIb3dldmVyLCBpZiB5b3Ugd2FudCwgeW91CisgICAqIGNhbiBjcmVhdGUgYW5kIHJldHVybiBzdWJjbGFzcyBvYmplY3RzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBvZktpbmQuCisgICAqIFNpbXBseSBhZGQgdGhlIGNhc2VzIHRvIHRoZSBzd2l0Y2ggZm9yIGFsbCB0aG9zZSBzcGVjaWFsIGNhc2VzLgorICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBzdWJjbGFzcyBvZiBUb2tlbiBjYWxsZWQgSURUb2tlbiB0aGF0CisgICAqIHlvdSB3YW50IHRvIGNyZWF0ZSBpZiBvZktpbmQgaXMgSUQsIHNpbWxweSBhZGQgc29tZXRoaW5nIGxpa2UgOgorICAgKgorICAgKiAgICBjYXNlIE15UGFyc2VyQ29uc3RhbnRzLklEIDogcmV0dXJuIG5ldyBJRFRva2VuKCk7CisgICAqCisgICAqIHRvIHRoZSBmb2xsb3dpbmcgc3dpdGNoIHN0YXRlbWVudC4gVGhlbiB5b3UgY2FuIGNhc3QgbWF0Y2hlZFRva2VuCisgICAqIHZhcmlhYmxlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGFuZCB1c2UgaXQgaW4geW91ciBsZXhpY2FsIGFjdGlvbnMuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuIG5ld1Rva2VuKGludCBvZktpbmQpCisgIHsKKyAgICAgc3dpdGNoKG9mS2luZCkKKyAgICAgeworICAgICAgIGRlZmF1bHQgOiByZXR1cm4gbmV3IFRva2VuKCk7CisgICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvZ3JhbW1hci9qYXZhY2NQYXJzZXIvVG9rZW5NZ3JFcnJvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvamF2YWNjUGFyc2VyL1Rva2VuTWdyRXJyb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjQxZDNiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL2dyYW1tYXIvamF2YWNjUGFyc2VyL1Rva2VuTWdyRXJyb3IuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbk1nckVycm9yLmphdmEgVmVyc2lvbiAzLjAgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CisKK3B1YmxpYyBjbGFzcyBUb2tlbk1nckVycm9yIGV4dGVuZHMgRXJyb3IKK3sKKyAgIC8qCisgICAgKiBPcmRpbmFscyBmb3IgdmFyaW91cyByZWFzb25zIHdoeSBhbiBFcnJvciBvZiB0aGlzIHR5cGUgY2FuIGJlIHRocm93bi4KKyAgICAqLworCisgICAvKioKKyAgICAqIExleGljYWwgZXJyb3Igb2NjdXJlZC4KKyAgICAqLworICAgc3RhdGljIGZpbmFsIGludCBMRVhJQ0FMX0VSUk9SID0gMDsKKworICAgLyoqCisgICAgKiBBbiBhdHRlbXB0IHdhc3MgbWFkZSB0byBjcmVhdGUgYSBzZWNvbmQgaW5zdGFuY2Ugb2YgYSBzdGF0aWMgdG9rZW4gbWFuYWdlci4KKyAgICAqLworICAgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfTEVYRVJfRVJST1IgPSAxOworCisgICAvKioKKyAgICAqIFRyaWVkIHRvIGNoYW5nZSB0byBhbiBpbnZhbGlkIGxleGljYWwgc3RhdGUuCisgICAgKi8KKyAgIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFID0gMjsKKworICAgLyoqCisgICAgKiBEZXRlY3RlZCAoYW5kIGJhaWxlZCBvdXQgb2YpIGFuIGluZmluaXRlIGxvb3AgaW4gdGhlIHRva2VuIG1hbmFnZXIuCisgICAgKi8KKyAgIHN0YXRpYyBmaW5hbCBpbnQgTE9PUF9ERVRFQ1RFRCA9IDM7CisKKyAgIC8qKgorICAgICogSW5kaWNhdGVzIHRoZSByZWFzb24gd2h5IHRoZSBleGNlcHRpb24gaXMgdGhyb3duLiBJdCB3aWxsIGhhdmUKKyAgICAqIG9uZSBvZiB0aGUgYWJvdmUgNCB2YWx1ZXMuCisgICAgKi8KKyAgIGludCBlcnJvckNvZGU7CisKKyAgIC8qKgorICAgICogUmVwbGFjZXMgdW5wcmludGFibGUgY2hhcmFjdGVycyBieSB0aGVpciBlc3BhY2VkIChvciB1bmljb2RlIGVzY2FwZWQpCisgICAgKiBlcXVpdmFsZW50cyBpbiB0aGUgZ2l2ZW4gc3RyaW5nCisgICAgKi8KKyAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGFkZEVzY2FwZXMoU3RyaW5nIHN0cikgeworICAgICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgIGNoYXIgY2g7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKKyAgICAgICAgeworICAgICAgICAgICBjYXNlIDAgOgorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgeworICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKKyAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7CisgICB9CisKKyAgIC8qKgorICAgICogUmV0dXJucyBhIGRldGFpbGVkIG1lc3NhZ2UgZm9yIHRoZSBFcnJvciB3aGVuIGl0IGlzIHRocm93biBieSB0aGUKKyAgICAqIHRva2VuIG1hbmFnZXIgdG8gaW5kaWNhdGUgYSBsZXhpY2FsIGVycm9yLgorICAgICogUGFyYW1ldGVycyA6IAorICAgICogICAgRU9GU2VlbiAgICAgOiBpbmRpY2F0ZXMgaWYgRU9GIGNhdXNlZCB0aGUgbGV4aWNsIGVycm9yCisgICAgKiAgICBjdXJMZXhTdGF0ZSA6IGxleGljYWwgc3RhdGUgaW4gd2hpY2ggdGhpcyBlcnJvciBvY2N1cmVkCisgICAgKiAgICBlcnJvckxpbmUgICA6IGxpbmUgbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VyZWQKKyAgICAqICAgIGVycm9yQ29sdW1uIDogY29sdW1uIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cmVkCisgICAgKiAgICBlcnJvckFmdGVyICA6IHByZWZpeCB0aGF0IHdhcyBzZWVuIGJlZm9yZSB0aGlzIGVycm9yIG9jY3VyZWQKKyAgICAqICAgIGN1cmNoYXIgICAgIDogdGhlIG9mZmVuZGluZyBjaGFyYWN0ZXIKKyAgICAqIE5vdGU6IFlvdSBjYW4gY3VzdG9taXplIHRoZSBsZXhpY2FsIGVycm9yIG1lc3NhZ2UgYnkgbW9kaWZ5aW5nIHRoaXMgbWV0aG9kLgorICAgICovCisgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBMZXhpY2FsRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsIGludCBlcnJvckxpbmUsIGludCBlcnJvckNvbHVtbiwgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhcikgeworICAgICAgcmV0dXJuKCJMZXhpY2FsIGVycm9yIGF0IGxpbmUgIiArCisgICAgICAgICAgIGVycm9yTGluZSArICIsIGNvbHVtbiAiICsKKyAgICAgICAgICAgZXJyb3JDb2x1bW4gKyAiLiAgRW5jb3VudGVyZWQ6ICIgKworICAgICAgICAgICAoRU9GU2VlbiA/ICI8RU9GPiAiIDogKCJcIiIgKyBhZGRFc2NhcGVzKFN0cmluZy52YWx1ZU9mKGN1ckNoYXIpKSArICJcIiIpICsgIiAoIiArIChpbnQpY3VyQ2hhciArICIpLCAiKSArCisgICAgICAgICAgICJhZnRlciA6IFwiIiArIGFkZEVzY2FwZXMoZXJyb3JBZnRlcikgKyAiXCIiKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBZb3UgY2FuIGFsc28gbW9kaWZ5IHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB5b3VyIGVycm9yIG1lc3NhZ2VzLgorICAgICogRm9yIGV4YW1wbGUsIGNhc2VzIGxpa2UgTE9PUF9ERVRFQ1RFRCBhbmQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFIGFyZSBub3QKKyAgICAqIG9mIGVuZC11c2VycyBjb25jZXJuLCBzbyB5b3UgY2FuIHJldHVybiBzb21ldGhpbmcgbGlrZSA6IAorICAgICoKKyAgICAqICAgICAiSW50ZXJuYWwgRXJyb3IgOiBQbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQgLi4uLiAiCisgICAgKgorICAgICogZnJvbSB0aGlzIG1ldGhvZCBmb3Igc3VjaCBjYXNlcyBpbiB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIHlvdXIgcGFyc2VyLgorICAgICovCisgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOworICAgfQorCisgICAvKgorICAgICogQ29uc3RydWN0b3JzIG9mIHZhcmlvdXMgZmxhdm9ycyBmb2xsb3cuCisgICAgKi8KKworICAgcHVibGljIFRva2VuTWdyRXJyb3IoKSB7CisgICB9CisKKyAgIHB1YmxpYyBUb2tlbk1nckVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgcmVhc29uKSB7CisgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgIGVycm9yQ29kZSA9IHJlYXNvbjsKKyAgIH0KKworICAgcHVibGljIFRva2VuTWdyRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsIGludCBlcnJvckxpbmUsIGludCBlcnJvckNvbHVtbiwgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhciwgaW50IHJlYXNvbikgeworICAgICAgdGhpcyhMZXhpY2FsRXJyb3IoRU9GU2VlbiwgbGV4U3RhdGUsIGVycm9yTGluZSwgZXJyb3JDb2x1bW4sIGVycm9yQWZ0ZXIsIGN1ckNoYXIpLCByZWFzb24pOworICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZDc1MmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMvKioKKyMgKiA8Y29weXJpZ2h0PgorIyAqCisjICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqIAorIyAqIENvbnRyaWJ1dG9yczogCisjICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKgorIyAqIDwvY29weXJpZ2h0PgorIyAqCisjICogJElkOiBwbHVnaW4ucHJvcGVydGllcyx2IDEuMSAyMDA4LzAxLzE1IDA2OjEwOjE1IGNkYWx5IEV4cCAkCisjICovCisKKyMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAorIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1BsdWdpbi5uYW1lID0gRW1mYXRpYyBDb3JlCitQbHVnaW4ucHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9FbWZhdGljQ29yZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL0VtZmF0aWNDb3JlUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkMDFhOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9FbWZhdGljQ29yZVBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KKyAqLworcHVibGljIGNsYXNzIEVtZmF0aWNDb3JlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisJLy9UaGUgc2hhcmVkIGluc3RhbmNlLgorCXByaXZhdGUgc3RhdGljIEVtZmF0aWNDb3JlUGx1Z2luIHBsdWdpbjsKKwkvL1Jlc291cmNlIGJ1bmRsZS4KKwlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOworCQorCS8qKgorCSAqIFRoZSBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgRW1mYXRpY0NvcmVQbHVnaW4oKSB7CisJCXN1cGVyKCk7CisJCXBsdWdpbiA9IHRoaXM7CisJCXRyeSB7CisJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5FbWZhdGljQ29yZVBsdWdpblJlc291cmNlcyIpOworCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgeworCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCisJICovCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RhcnQoY29udGV4dCk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAorCSAqLworCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCisJICovCisJcHVibGljIHN0YXRpYyBFbWZhdGljQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCisJICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gRW1mYXRpY0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7CisJCXRyeSB7CisJCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBrZXk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCisJICovCisJcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgeworCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyYXRvci9lY29yZS9CdWlsZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJhdG9yL2Vjb3JlL0J1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RhYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyYXRvci9lY29yZS9CdWlsZGVyLmphdmEKQEAgLTAsMCArMSw1NzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lY29yZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmljcy51dGlsLk9uZVRvT25lTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQW5ub3RhdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkNsYXNzRGVjbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Db21wVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5EYXRhVHlwZURlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW1mYXRpY0FTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW1mYXRpY0FTVE5vZGVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkVtZmF0aWNUb2tlbk5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW51bURlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW51bUxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuS2V5RXF1YWxzVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuTWFwRW50cnlEZWNsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0Lk1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0Lk1vZGlmaWVyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5NdWx0aXBsaWNpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuT25lT3JNb3JlVHlwZVBhcmFtczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5PcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuT3B0TmVnYXRlZE1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlBhY2thZ2VEZWNsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlBhcmFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5TdWJQYWNrYWdlRGVjbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Ub3BMZXZlbERlY2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlR5cGVQYXJhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5UeXBlV2l0aE11bHRpOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUudXRpbC5FbWZhdGljQW5ub3RhdGlvbk1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5wYXJzZXIuUGFyc2VDb250ZXh0OworCisKK3B1YmxpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgR2VuZXJhdGlvblBoYXNlIHsKKworCXByaXZhdGUgRW1mYXRpY0Fubm90YXRpb25NYXAgX2Fubm90YXRpb25NYXA7CisJcHJpdmF0ZSBPbmVUb09uZU1hcDxBU1ROb2RlLCBFT2JqZWN0PiBjc3REZWNsMkVjb3JlQVNUID0gbmV3IE9uZVRvT25lTWFwPEFTVE5vZGUsIEVPYmplY3Q+KCk7CisJCisKKwlwdWJsaWMgQnVpbGRlcigpIHsKKwl9CisKKwlwdWJsaWMgdm9pZCBidWlsZChQYXJzZUNvbnRleHQgcGFyc2VDb250ZXh0LCBSZXNvdXJjZSByZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQljc3REZWNsMkVjb3JlQVNULmNsZWFyKCk7CisJCWluaXRQYXJzZUNvbnRleHQocGFyc2VDb250ZXh0KTsKKwkJX2Fubm90YXRpb25NYXAgPSBuZXcgRW1mYXRpY0Fubm90YXRpb25NYXAoKTsKKwkJQ29tcFVuaXQgY29tcFVuaXQgPSAoQ29tcFVuaXQpIHBhcnNlQ29udGV4dC5nZXRQYXJzZVJvb3QoKTsKKwkJYnVpbGRQYWNrYWdlKGNvbXBVbml0LCByZXNvdXJjZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGJ1aWxkUGFja2FnZShDb21wVW5pdCBjb21wVW5pdCwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJUGFja2FnZURlY2wgcGFja2FnZURlY2wgPSBjb21wVW5pdC5nZXRQYWNrYWdlRGVjbCgpOworCQlpZiAocGFja2FnZURlY2wgIT0gbnVsbCkgeworCQkJU3RyaW5nIG5hbWUgPSBnZXRJRFRleHQocGFja2FnZURlY2wuZ2V0TmFtZSgpKTsKKwkJCWJ1aWxkUGFja2FnZShuYW1lLCBwYWNrYWdlRGVjbC5nZXRBbm5vdGF0aW9ucygpLCBjb21wVW5pdC5nZXRUb3BMZXZlbERlY2xzKCksIHJlc291cmNlLmdldENvbnRlbnRzKCkpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGJ1aWxkUGFja2FnZShTdWJQYWNrYWdlRGVjbCBwYWNrYWdlRGVjbCwgRVBhY2thZ2UgcGFyZW50UGFja2FnZSkgeworCQlTdHJpbmcgbmFtZSA9IGdldElEVGV4dChwYWNrYWdlRGVjbC5nZXROYW1lKCkpOworCQlidWlsZFBhY2thZ2UobmFtZSwgcGFja2FnZURlY2wuZ2V0QW5ub3RhdGlvbnMoKSwgcGFja2FnZURlY2wuZ2V0VG9wTGV2ZWxEZWNscygpLCBwYXJlbnRQYWNrYWdlCisJCQkJLmdldEVTdWJwYWNrYWdlcygpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYnVpbGRQYWNrYWdlKFN0cmluZyBuYW1lLCBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucywgVG9wTGV2ZWxEZWNscyB0b3BMZXZlbERlY2xzLCBFTGlzdCBwYXJlbnRDb250ZW50cykgeworCQlmaW5hbCBFUGFja2FnZSBlUGFja2FnZSA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRVBhY2thZ2UoKTsKKwkJY3N0RGVjbDJFY29yZUFTVC5wdXQodG9wTGV2ZWxEZWNscy5nZXRQYXJlbnQoKSwgZVBhY2thZ2UpOworCQllUGFja2FnZS5zZXROYW1lKG5hbWUpOworCQlidWlsZEFubm90YXRpb25zKGFubm90YXRpb25zLCBlUGFja2FnZSk7CisJCXBhcmVudENvbnRlbnRzLmFkZChlUGFja2FnZSk7CisJCShuZXcgRW1mYXRpY0FTVE5vZGVWaXNpdG9yKCkgeworCisJCQlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFN1YlBhY2thZ2VEZWNsIHN1YlBhY2thZ2VEZWNsKSB7CisJCQkJaWYgKCFpc0R1cGxpY2F0ZU5hbWUoZVBhY2thZ2UsIHN1YlBhY2thZ2VEZWNsLmdldE5hbWUoKSkpCisJCQkJCWJ1aWxkUGFja2FnZShzdWJQYWNrYWdlRGVjbCwgZVBhY2thZ2UpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChDbGFzc0RlY2wgY2xhc3NEZWNsKSB7CisJCQkJaWYgKCFpc0R1cGxpY2F0ZU5hbWUoZVBhY2thZ2UsIGNsYXNzRGVjbC5nZXROYW1lKCkpKQorCQkJCQlidWlsZENsYXNzKGNsYXNzRGVjbCwgZVBhY2thZ2UpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChFbnVtRGVjbCBlbnVtRGVjbCkgeworCQkJCWlmICghaXNEdXBsaWNhdGVOYW1lKGVQYWNrYWdlLCBlbnVtRGVjbC5nZXROYW1lKCkpKQorCQkJCQlidWlsZEVudW0oZW51bURlY2wsIGVQYWNrYWdlKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoRGF0YVR5cGVEZWNsIGRhdGFUeXBlRGVjbCkgeworCQkJCWlmICghaXNEdXBsaWNhdGVOYW1lKGVQYWNrYWdlLCBkYXRhVHlwZURlY2wuZ2V0TmFtZSgpKSkKKwkJCQkJYnVpbGREYXRhVHlwZShkYXRhVHlwZURlY2wsIGVQYWNrYWdlKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoTWFwRW50cnlEZWNsIG1hcEVudHJ5RGVjbCkgeworCQkJCWlmICghaXNEdXBsaWNhdGVOYW1lKGVQYWNrYWdlLCBtYXBFbnRyeURlY2wuZ2V0TmFtZSgpKSkKKwkJCQkJYnVpbGRNYXBFbnRyeShtYXBFbnRyeURlY2wsIGVQYWNrYWdlKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJfSkudmlzaXQodG9wTGV2ZWxEZWNscyk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzRHVwbGljYXRlTmFtZShFUGFja2FnZSBjb250YWluaW5nUGFja2FnZSwgRW1mYXRpY1Rva2VuTm9kZSBuYW1lVG9rZW5Ob2RlKSB7CisJCVN0cmluZyBuYW1lID0gZ2V0SURUZXh0KG5hbWVUb2tlbk5vZGUpOworCQlpZiAoZ2V0U3ViUGFja2FnZShjb250YWluaW5nUGFja2FnZSwgbmFtZSkgIT0gbnVsbCkgeworCQkJbG9nRXJyb3IobmV3IEVtZmF0aWNTZW1hbnRpY0Vycm9yLkR1cGxpY2F0ZVBhY2thZ2VNZW1iZXJEZWNsYXJhdGlvbihuYW1lVG9rZW5Ob2RlKSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoY29udGFpbmluZ1BhY2thZ2UuZ2V0RUNsYXNzaWZpZXIobmFtZSkgIT0gbnVsbCkgeworCQkJbG9nRXJyb3IobmV3IEVtZmF0aWNTZW1hbnRpY0Vycm9yLkR1cGxpY2F0ZVBhY2thZ2VNZW1iZXJEZWNsYXJhdGlvbihuYW1lVG9rZW5Ob2RlKSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBidWlsZENsYXNzKENsYXNzRGVjbCBjbGFzc0RlY2wsIEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJCWZpbmFsIEVDbGFzcyBlQ2xhc3MgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVDbGFzcygpOworCQljc3REZWNsMkVjb3JlQVNULnB1dChjbGFzc0RlY2wsIGVDbGFzcyk7CisJCVN0cmluZyBuYW1lID0gZ2V0SURUZXh0KGNsYXNzRGVjbC5nZXROYW1lKCkpOworCQllQ2xhc3Muc2V0TmFtZShuYW1lKTsKKwkJYm9vbGVhbiBpc0Fic3RyYWN0ID0gY2xhc3NEZWNsLmdldEFic3RyYWN0TW9kaWZpZXIoKSAhPSBudWxsOworCQllQ2xhc3Muc2V0QWJzdHJhY3QoaXNBYnN0cmFjdCk7CisJCWJvb2xlYW4gaXNJbnRlcmZhY2UgPSAiaW50ZXJmYWNlIi5lcXVhbHMoY2xhc3NEZWNsLmdldENsYXNzS2luZCgpLmdldFRleHQoKSk7CisJCWVDbGFzcy5zZXRJbnRlcmZhY2UoaXNJbnRlcmZhY2UpOworCQlpZiAoY2xhc3NEZWNsLmdldEluc3RDbGFzc05hbWUoKSAhPSBudWxsKSB7CisJCQlTdHJpbmcgaW5zdENsYXNzTmFtZSA9IGdldFZhbHVlKGNsYXNzRGVjbC5nZXRJbnN0Q2xhc3NOYW1lKCkpOworCQkJZUNsYXNzLnNldEluc3RhbmNlQ2xhc3NOYW1lKGluc3RDbGFzc05hbWUpOworCQl9CisJCWJ1aWxkQW5ub3RhdGlvbnMoY2xhc3NEZWNsLmdldEFubm90YXRpb25zKCksIGVDbGFzcyk7CisJCWVQYWNrYWdlLmdldEVDbGFzc2lmaWVycygpLmFkZChlQ2xhc3MpOworCisJCXByb2Nlc3NUeXBlUGFyYW1WYXJzSW5FQ2xhc3MoY2xhc3NEZWNsLCBlQ2xhc3MpOworCisJCShuZXcgRW1mYXRpY0FTVE5vZGVWaXNpdG9yKCkgeworCisJCQlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJCQlpZiAoaXNEdXBsaWNhdGVOYW1lKGVDbGFzcywgYXR0cmlidXRlLmdldE5hbWUoKSkpIHsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0gZWxzZSB7CisJCQkJCUVBdHRyaWJ1dGUgZUF0dHIgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVBdHRyaWJ1dGUoKTsKKwkJCQkJY3N0RGVjbDJFY29yZUFTVC5wdXQoYXR0cmlidXRlLCBlQXR0cik7CisJCQkJCVN0cmluZyBhdHRyTmFtZSA9IGdldElEVGV4dChhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKwkJCQkJZUF0dHIuc2V0TmFtZShhdHRyTmFtZSk7CisJCQkJCXByb2Nlc3NNb2RpZmllcnMoYXR0cmlidXRlLmdldE1vZGlmaWVycygpLCBlQXR0cik7CisJCQkJCXNldE11bHRpcGxpY2l0eShhdHRyaWJ1dGUuZ2V0VHlwZVdpdGhNdWx0aSgpLmdldE11bHRpcGxpY2l0eSgpLCBlQXR0cik7CisJCQkJCWVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuYWRkKGVBdHRyKTsKKwkJCQkJaWYgKGF0dHJpYnV0ZS5nZXREZWZhdWx0VmFsdWVFeHByKCkgIT0gbnVsbCkgeworCQkJCQkJU3RyaW5nIGR2ID0gVG9rZW5UZXh0LkdldChhdHRyaWJ1dGUuZ2V0RGVmYXVsdFZhbHVlRXhwcigpKTsKKwkJCQkJCWVBdHRyLnNldERlZmF1bHRWYWx1ZUxpdGVyYWwoZHYpOworCQkJCQl9CisJCQkJCWJ1aWxkQW5ub3RhdGlvbnMoYXR0cmlidXRlLmdldEFubm90YXRpb25zKCksIGVBdHRyKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKworCQkJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJCQkJaWYgKGlzRHVwbGljYXRlTmFtZShlQ2xhc3MsIHJlZmVyZW5jZS5nZXROYW1lKCkpKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9IGVsc2UgeworCQkJCQlFUmVmZXJlbmNlIGVSZWYgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVSZWZlcmVuY2UoKTsKKwkJCQkJY3N0RGVjbDJFY29yZUFTVC5wdXQocmVmZXJlbmNlLCBlUmVmKTsKKwkJCQkJU3RyaW5nIHJlZk5hbWUgPSBnZXRJRFRleHQocmVmZXJlbmNlLmdldE5hbWUoKSk7CisJCQkJCWVSZWYuc2V0TmFtZShyZWZOYW1lKTsKKwkJCQkJcHJvY2Vzc01vZGlmaWVycyhyZWZlcmVuY2UuZ2V0TW9kaWZpZXJzKCksIGVSZWYpOworCQkJCQlzZXRNdWx0aXBsaWNpdHkocmVmZXJlbmNlLmdldFR5cGVXaXRoTXVsdGkoKS5nZXRNdWx0aXBsaWNpdHkoKSwgZVJlZik7CisJCQkJCWVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuYWRkKGVSZWYpOworCQkJCQlidWlsZEFubm90YXRpb25zKHJlZmVyZW5jZS5nZXRBbm5vdGF0aW9ucygpLCBlUmVmKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKworCQkJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChPcGVyYXRpb24gb3BlcmF0aW9uKSB7CisJCQkJYnVpbGRPcGVyYXRpb24ob3BlcmF0aW9uLCBlQ2xhc3MpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQl9KS52aXNpdChjbGFzc0RlY2wuZ2V0Q2xhc3NNZW1iZXJEZWNscygpKTsKKworCX0KKworCS8qKgorCSAqIHByb2Nlc3Npbmcgb2YgdGhlIGJvdW5kcyBvZiB0eXBlIHBhcmFtcyBoYXMgdG8gYmUgZGVsYXllZCBhcyBzb21lIG9mIHRoZW0KKwkgKiBtYXkgcmVmZXIgdG8gRUNsYXNzJ2VzIG5vdCB5ZXQgYWRkZWQgdG8gdGhlIEVQYWNrYWdlLiBUaGUgdHlwZSB2YXJpYWJsZXMKKwkgKiAoYnV0IG5vdCB0aGVpciBib3VuZHMpIGFyZSBhZGRlZCBub3cgaG93ZXZlciBhcyB0aGV5IG1heSBiZSBuZWVkZWQgdG8KKwkgKiBjb3JyZWN0bHkgZGV0ZXJtaW5lIHVzYWdlcy1kZWNsYXJhdGlvbnM6IGEgdHlwZSB2YXJpYWJsZSB3aXRoIHRoZSBzYW1lCisJICogbmFtZSBhcyBhbiBFQ2xhc3NpZmllciBlZmZlY3RpdmVseSBoaWRlcyBpdC4gdGh1cyBleHBsYWluaW5nIHdoeSB0eXBlCisJICogdmFycyBhcmUgYWRkZWQgdG8gdGhlIEVDbGFzcyBiZWZvcmUgYW55IGF0dHIgb3IgcmVmIG9yIG9wLgorCSAqLworCXByaXZhdGUgdm9pZCBwcm9jZXNzVHlwZVBhcmFtVmFyc0luRUNsYXNzKENsYXNzRGVjbCBjbGFzc0RlY2wsIGZpbmFsIEVDbGFzcyBlQ2xhc3MpIHsKKwkJaWYgKGNsYXNzRGVjbC5nZXRUeXBlUGFyYW1zSW5mbygpID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlPbmVPck1vcmVUeXBlUGFyYW1zIG9vbXRwcyA9IGNsYXNzRGVjbC5nZXRUeXBlUGFyYW1zSW5mbygpLmdldE9uZU9yTW9yZVR5cGVQYXJhbXMoKTsKKwkJaWYgKG9vbXRwcyA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJZm9yIChBU1ROb2RlIG4gOiBvb210cHMuZ2V0Q2hpbGRyZW4oKSkgeworCQkJaWYgKG4gaW5zdGFuY2VvZiBUeXBlUGFyYW0pIHsKKwkJCQlUeXBlUGFyYW0gdHAgPSAoVHlwZVBhcmFtKSBuOworCQkJCUVtZmF0aWNUb2tlbk5vZGUgbmFtZVRva2VuTm9kZSA9IHRwLmdldFR5cGVWYXJOYW1lKCk7CisJCQkJaWYgKGlzRHVwbGljYXRlVHlwZVZhck5hbWUoZUNsYXNzLmdldEVUeXBlUGFyYW1ldGVycygpLCBuYW1lVG9rZW5Ob2RlKSkgeworCQkJCQlsb2dFcnJvcihuZXcgRW1mYXRpY1NlbWFudGljRXJyb3IuRHVwbGljYXRlVHlwZVZhcmlhYmxlTmFtZShuYW1lVG9rZW5Ob2RlKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJRVR5cGVQYXJhbWV0ZXIgZXRwID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFVHlwZVBhcmFtZXRlcigpOworCQkJCQljc3REZWNsMkVjb3JlQVNULnB1dCh0cCwgZXRwKTsKKwkJCQkJU3RyaW5nIHR2TmFtZSA9IGdldElEVGV4dCh0cC5nZXRUeXBlVmFyTmFtZSgpKTsKKwkJCQkJZXRwLnNldE5hbWUodHZOYW1lKTsKKwkJCQkJZUNsYXNzLmdldEVUeXBlUGFyYW1ldGVycygpLmFkZChldHApOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwcm9jZXNzVHlwZVBhcmFtVmFyc0luRU9wZXJhdGlvbihPcGVyYXRpb24gb0RlY2wsIGZpbmFsIEVPcGVyYXRpb24gZU9wKSB7CisJCWlmIChvRGVjbC5nZXRUeXBlUGFyYW1zSW5mbygpID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlPbmVPck1vcmVUeXBlUGFyYW1zIG9vbXRwcyA9IG9EZWNsLmdldFR5cGVQYXJhbXNJbmZvKCkuZ2V0T25lT3JNb3JlVHlwZVBhcmFtcygpOworCQlpZiAob29tdHBzID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlmb3IgKEFTVE5vZGUgbiA6IG9vbXRwcy5nZXRDaGlsZHJlbigpKSB7CisJCQlpZiAobiBpbnN0YW5jZW9mIFR5cGVQYXJhbSkgeworCQkJCVR5cGVQYXJhbSB0cCA9IChUeXBlUGFyYW0pIG47CisJCQkJRW1mYXRpY1Rva2VuTm9kZSBuYW1lVG9rZW5Ob2RlID0gdHAuZ2V0VHlwZVZhck5hbWUoKTsKKwkJCQkvLyBsb29rIG91dCBmb3IgZHVwbGljYXRlcyBhbW9uZyBvdGhlciBvcGVyYXRpb24tbGV2ZWwgdHlwZQorCQkJCS8vIHBhcmFtcworCQkJCWlmIChpc0R1cGxpY2F0ZVR5cGVWYXJOYW1lKGVPcC5nZXRFVHlwZVBhcmFtZXRlcnMoKSwgbmFtZVRva2VuTm9kZSkpIHsKKwkJCQkJbG9nRXJyb3IobmV3IEVtZmF0aWNTZW1hbnRpY0Vycm9yLkR1cGxpY2F0ZVR5cGVWYXJpYWJsZU5hbWUobmFtZVRva2VuTm9kZSkpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIGxvb2sgb3V0IGZvciBkdXBsaWNhdGVzIGFtb25nIGNsYXNzLWxldmVsIHR5cGUgcGFyYW1zCisJCQkJCWlmIChpc0R1cGxpY2F0ZVR5cGVWYXJOYW1lKGVPcC5nZXRFQ29udGFpbmluZ0NsYXNzKCkuZ2V0RVR5cGVQYXJhbWV0ZXJzKCksIG5hbWVUb2tlbk5vZGUpKSB7CisJCQkJCQlsb2dFcnJvcihuZXcgRW1mYXRpY1NlbWFudGljRXJyb3IuRHVwbGljYXRlVHlwZVZhcmlhYmxlTmFtZShuYW1lVG9rZW5Ob2RlKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlFVHlwZVBhcmFtZXRlciBldHAgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVUeXBlUGFyYW1ldGVyKCk7CisJCQkJCQljc3REZWNsMkVjb3JlQVNULnB1dCh0cCwgZXRwKTsKKwkJCQkJCVN0cmluZyB0dk5hbWUgPSBnZXRJRFRleHQodHAuZ2V0VHlwZVZhck5hbWUoKSk7CisJCQkJCQlldHAuc2V0TmFtZSh0dk5hbWUpOworCQkJCQkJZU9wLmdldEVUeXBlUGFyYW1ldGVycygpLmFkZChldHApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzRHVwbGljYXRlVHlwZVZhck5hbWUoRUxpc3Q8RVR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzLCBFbWZhdGljVG9rZW5Ob2RlIG5hbWVUb2tlbk5vZGUpIHsKKwkJU3RyaW5nIHR2TmFtZSA9IGdldElEVGV4dChuYW1lVG9rZW5Ob2RlKTsKKwkJZm9yIChFVHlwZVBhcmFtZXRlciB0cCA6IHR5cGVQYXJhbWV0ZXJzKSB7CisJCQlpZiAodHAuZ2V0TmFtZSgpLmVxdWFscyh0dk5hbWUpKSB7CisJCQkJbG9nRXJyb3IobmV3IEVtZmF0aWNTZW1hbnRpY0Vycm9yLkR1cGxpY2F0ZVR5cGVWYXJpYWJsZU5hbWUobmFtZVRva2VuTm9kZSkpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNEdXBsaWNhdGVOYW1lKEVDbGFzcyBjb250YWluaW5nQ2xhc3MsIEVtZmF0aWNUb2tlbk5vZGUgbmFtZVRva2VuTm9kZSkgeworCQlTdHJpbmcgbmFtZSA9IGdldElEVGV4dChuYW1lVG9rZW5Ob2RlKTsKKwkJaWYgKGNvbnRhaW5pbmdDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmUobmFtZSkgIT0gbnVsbCkgeworCQkJbG9nRXJyb3IobmV3IEVtZmF0aWNTZW1hbnRpY0Vycm9yLkR1cGxpY2F0ZUNsYXNzU3RydWN0dXJhbEZlYXR1cmVEZWNsYXJhdGlvbihuYW1lVG9rZW5Ob2RlKSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBidWlsZE9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uLCBFQ2xhc3MgZUNsYXNzKSB7CisJCWZpbmFsIEVPcGVyYXRpb24gZU9wID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFT3BlcmF0aW9uKCk7CisJCWNzdERlY2wyRWNvcmVBU1QucHV0KG9wZXJhdGlvbiwgZU9wKTsKKwkJU3RyaW5nIG9wTmFtZSA9IGdldElEVGV4dChvcGVyYXRpb24uZ2V0TmFtZSgpKTsKKwkJZU9wLnNldE5hbWUob3BOYW1lKTsKKwkJcHJvY2Vzc01vZGlmaWVycyhvcGVyYXRpb24uZ2V0TW9kaWZpZXJzKCksIGVPcCk7CisJCWlmIChvcGVyYXRpb24uZ2V0UmVzVHlwZSgpIGluc3RhbmNlb2YgVHlwZVdpdGhNdWx0aSkgeworCQkJVHlwZVdpdGhNdWx0aSB0d20gPSAoVHlwZVdpdGhNdWx0aSkgb3BlcmF0aW9uLmdldFJlc1R5cGUoKTsKKwkJCU11bHRpcGxpY2l0eSBvcE11bHRpID0gdHdtLmdldE11bHRpcGxpY2l0eSgpOworCQkJc2V0TXVsdGlwbGljaXR5KG9wTXVsdGksIGVPcCk7CisJCX0KKwkJZUNsYXNzLmdldEVPcGVyYXRpb25zKCkuYWRkKGVPcCk7CisJCWJ1aWxkQW5ub3RhdGlvbnMob3BlcmF0aW9uLmdldEFubm90YXRpb25zKCksIGVPcCk7CisJCWlmIChvcGVyYXRpb24uZ2V0UGFyYW1zKCkgIT0gbnVsbCkKKwkJCShuZXcgRW1mYXRpY0FTVE5vZGVWaXNpdG9yKCkgeworCisJCQkJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChQYXJhbSBwYXJhbSkgeworCQkJCQlFUGFyYW1ldGVyIGVQYXJhbSA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRVBhcmFtZXRlcigpOworCQkJCQljc3REZWNsMkVjb3JlQVNULnB1dChwYXJhbSwgZVBhcmFtKTsKKwkJCQkJU3RyaW5nIHBhcmFtTmFtZSA9IGdldElEVGV4dChwYXJhbS5nZXROYW1lKCkpOworCQkJCQllUGFyYW0uc2V0TmFtZShwYXJhbU5hbWUpOworCQkJCQlwcm9jZXNzTW9kaWZpZXJzKHBhcmFtLmdldE1vZGlmaWVycygpLCBlUGFyYW0pOworCQkJCQlzZXRNdWx0aXBsaWNpdHkocGFyYW0uZ2V0VHlwZVdpdGhNdWx0aSgpLmdldE11bHRpcGxpY2l0eSgpLCBlUGFyYW0pOworCQkJCQllT3AuZ2V0RVBhcmFtZXRlcnMoKS5hZGQoZVBhcmFtKTsKKwkJCQkJYnVpbGRBbm5vdGF0aW9ucyhwYXJhbSwgZVBhcmFtKTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKworCQkJfSkudmlzaXQob3BlcmF0aW9uLmdldFBhcmFtcygpKTsKKwkJcHJvY2Vzc1R5cGVQYXJhbVZhcnNJbkVPcGVyYXRpb24ob3BlcmF0aW9uLCBlT3ApOworCX0KKworCXByaXZhdGUgdm9pZCBidWlsZEVudW0oRW51bURlY2wgZW51bURlY2wsIEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJCWZpbmFsIEVFbnVtIGVFbnVtID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFRW51bSgpOworCQljc3REZWNsMkVjb3JlQVNULnB1dChlbnVtRGVjbCwgZUVudW0pOworCQlmaW5hbCBpbnQgbGFzdFZhbFtdID0geyAtMSB9OworCQlTdHJpbmcgbmFtZSA9IGdldElEVGV4dChlbnVtRGVjbC5nZXROYW1lKCkpOworCQllRW51bS5zZXROYW1lKG5hbWUpOworCQlidWlsZEFubm90YXRpb25zKGVudW1EZWNsLmdldEFubm90YXRpb25zKCksIGVFbnVtKTsKKwkJZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXJzKCkuYWRkKGVFbnVtKTsKKwkJKG5ldyBFbWZhdGljQVNUTm9kZVZpc2l0b3IoKSB7CisKKwkJCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoRW51bUxpdGVyYWwgZW51bUxpdGVyYWwpIHsKKwkJCQlFRW51bUxpdGVyYWwgZUxpdCA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUVudW1MaXRlcmFsKCk7CisJCQkJY3N0RGVjbDJFY29yZUFTVC5wdXQoZW51bUxpdGVyYWwsIGVMaXQpOworCQkJCVN0cmluZyBsaXRlcmFsTmFtZSA9IGdldElEVGV4dChlbnVtTGl0ZXJhbC5nZXROYW1lKCkpOworCQkJCWVMaXQuc2V0TmFtZShsaXRlcmFsTmFtZSk7CisJCQkJaW50IHZhbHVlOworCQkJCWlmIChlbnVtTGl0ZXJhbC5nZXRWYWwoKSA9PSBudWxsKQorCQkJCQl2YWx1ZSA9IGxhc3RWYWxbMF0gKyAxOworCQkJCWVsc2UKKwkJCQkJdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KGVudW1MaXRlcmFsLmdldFZhbCgpLmdldFRleHQoKSk7CisJCQkJZUxpdC5zZXRWYWx1ZSh2YWx1ZSk7CisJCQkJbGFzdFZhbFswXSA9IHZhbHVlOworCQkJCWJ1aWxkQW5ub3RhdGlvbnMoZW51bUxpdGVyYWwsIGVMaXQpOworCQkJCWVFbnVtLmdldEVMaXRlcmFscygpLmFkZChlTGl0KTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJfSkudmlzaXQoZW51bURlY2wuZ2V0RW51bUxpdGVyYWxzKCkpOworCX0KKworCXByaXZhdGUgdm9pZCBidWlsZERhdGFUeXBlKERhdGFUeXBlRGVjbCBkYXRhVHlwZURlY2wsIEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJCUVEYXRhVHlwZSBlRGF0YVR5cGUgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVEYXRhVHlwZSgpOworCQljc3REZWNsMkVjb3JlQVNULnB1dChkYXRhVHlwZURlY2wsIGVEYXRhVHlwZSk7CisJCVN0cmluZyBuYW1lID0gZ2V0SURUZXh0KGRhdGFUeXBlRGVjbC5nZXROYW1lKCkpOworCQllRGF0YVR5cGUuc2V0TmFtZShuYW1lKTsKKwkJYm9vbGVhbiBpc1NlcmlhbGl6YWJsZSA9IGRhdGFUeXBlRGVjbC5nZXRUcmFuc2llbnRNb2RpZmllcigpID09IG51bGw7CisJCWVEYXRhVHlwZS5zZXRTZXJpYWxpemFibGUoaXNTZXJpYWxpemFibGUpOworCQlTdHJpbmcgaW5zdENsYXNzTmFtZSA9IGdldFZhbHVlKGRhdGFUeXBlRGVjbC5nZXRJbnN0Q2xhc3NOYW1lKCkpOworCQllRGF0YVR5cGUuc2V0SW5zdGFuY2VDbGFzc05hbWUoaW5zdENsYXNzTmFtZSk7CisJCWJ1aWxkQW5ub3RhdGlvbnMoZGF0YVR5cGVEZWNsLmdldEFubm90YXRpb25zKCksIGVEYXRhVHlwZSk7CisJCWVQYWNrYWdlLmdldEVDbGFzc2lmaWVycygpLmFkZChlRGF0YVR5cGUpOworCX0KKworCXByaXZhdGUgdm9pZCBidWlsZE1hcEVudHJ5KE1hcEVudHJ5RGVjbCBtYXBFbnRyeURlY2wsIEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJCUVDbGFzcyBlQ2xhc3MgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVDbGFzcygpOworCQljc3REZWNsMkVjb3JlQVNULnB1dChtYXBFbnRyeURlY2wsIGVDbGFzcyk7CisJCVN0cmluZyBuYW1lID0gZ2V0SURUZXh0KG1hcEVudHJ5RGVjbC5nZXROYW1lKCkpOworCQllQ2xhc3Muc2V0TmFtZShuYW1lKTsKKwkJZUNsYXNzLnNldEluc3RhbmNlQ2xhc3NOYW1lKCJqYXZhLnV0aWwuTWFwJEVudHJ5Iik7CisJCWJ1aWxkQW5ub3RhdGlvbnMobWFwRW50cnlEZWNsLmdldEFubm90YXRpb25zKCksIGVDbGFzcyk7CisJCWVQYWNrYWdlLmdldEVDbGFzc2lmaWVycygpLmFkZChlQ2xhc3MpOworCX0KKworCXByaXZhdGUgdm9pZCBidWlsZEFubm90YXRpb25zKEVtZmF0aWNBU1ROb2RlIG5vZGUsIGZpbmFsIEVNb2RlbEVsZW1lbnQgZU1vZGVsRWxlbWVudCkgeworCQkobmV3IEVtZmF0aWNBU1ROb2RlVmlzaXRvcigpIHsKKworCQkJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKKwkJCQlTdHJpbmcgbGl0ZXJhbFNvdXJjZVVSSSA9IGdldFZhbHVlKGFubm90YXRpb24uZ2V0U291cmNlKCkpOworCQkJCWlmICgibmFtZXNwYWNlIi5lcXVhbHMobGl0ZXJhbFNvdXJjZVVSSS50b0xvd2VyQ2FzZSgpKSAmJiAoZU1vZGVsRWxlbWVudCBpbnN0YW5jZW9mIEVQYWNrYWdlKSkgeworCQkJCQlwcm9jZXNzUGFja2FnZU5hbWVzcGFjZUFubm90YXRpb24oYW5ub3RhdGlvbiwgKEVQYWNrYWdlKSBlTW9kZWxFbGVtZW50KTsKKwkJCQl9IGVsc2UgeworCQkJCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUFubm90YXRpb24oKTsKKwkJCQkJY3N0RGVjbDJFY29yZUFTVC5wdXQoYW5ub3RhdGlvbiwgZUFubm90YXRpb24pOworCQkJCQlTdHJpbmcgbWFwcGVkU291cmNlVVJJID0gX2Fubm90YXRpb25NYXAubWFwU291cmNlVVJJKGxpdGVyYWxTb3VyY2VVUkkpOworCQkJCQlpZiAobWFwcGVkU291cmNlVVJJICE9IG51bGwpCisJCQkJCQllQW5ub3RhdGlvbi5zZXRTb3VyY2UobWFwcGVkU291cmNlVVJJKTsKKwkJCQkJZWxzZQorCQkJCQkJZUFubm90YXRpb24uc2V0U291cmNlKGxpdGVyYWxTb3VyY2VVUkkpOworCQkJCQllTW9kZWxFbGVtZW50LmdldEVBbm5vdGF0aW9ucygpLmFkZChlQW5ub3RhdGlvbik7CisJCQkJCWlmICgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwNC9FbWZhdGljQW5ub3RhdGlvbk1hcCIuZXF1YWxzKGVBbm5vdGF0aW9uLmdldFNvdXJjZSgpKSkKKwkJCQkJCXVwZGF0ZUFubm90YXRpb25NYXAoYW5ub3RhdGlvbiwgZUFubm90YXRpb24pOworCQkJCQllbHNlCisJCQkJCQlwcm9jZXNzQW5ub3RhdGlvbihhbm5vdGF0aW9uLCBlQW5ub3RhdGlvbiwgbGl0ZXJhbFNvdXJjZVVSSSk7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQl9KS52aXNpdChub2RlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlQW5ub3RhdGlvbk1hcChBbm5vdGF0aW9uIGFubm90YXRpb24sIGZpbmFsIEVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uKSB7CisJCShuZXcgRW1mYXRpY0FTVE5vZGVWaXNpdG9yKCkgeworCisJCQlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KEtleUVxdWFsc1ZhbHVlIGtleUVxdWFsc1ZhbHVlKSB7CisJCQkJU3RyaW5nIGtleSA9IGdldFZhbHVlKGtleUVxdWFsc1ZhbHVlLmdldEtleSgpKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZShrZXlFcXVhbHNWYWx1ZS5nZXRWYWx1ZSgpKTsKKwkJCQlTdHJpbmcgbGFiZWwgPSBfYW5ub3RhdGlvbk1hcC5hZGRNYXBwaW5nKGtleSwgdmFsdWUsIGtleUVxdWFsc1ZhbHVlLCBCdWlsZGVyLnRoaXMpOworCQkJCWlmIChsYWJlbCAhPSBudWxsKQorCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkKKwkJCQkJCWVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoa2V5LCB2YWx1ZSk7CisJCQkJCWVsc2UKKwkJCQkJCWVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoa2V5LCBsYWJlbCk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCX0pLnZpc2l0KGFubm90YXRpb24pOworCX0KKworCXByaXZhdGUgdm9pZCBwcm9jZXNzQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24sIGZpbmFsIEVBbm5vdGF0aW9uIGVBbm5vdGF0aW9uLCBTdHJpbmcgbGl0ZXJhbFNvdXJjZVVSSSkgeworCQlmaW5hbCBpbnQgdGVtcFtdID0gbmV3IGludFsxXTsKKwkJKG5ldyBFbWZhdGljQVNUTm9kZVZpc2l0b3IoKSB7CisKKwkJCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoS2V5RXF1YWxzVmFsdWUga2V5RXF1YWxzVmFsdWUpIHsKKwkJCQl0ZW1wWzBdKys7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCX0pLnZpc2l0KGFubm90YXRpb24pOworCQlmaW5hbCBpbnQgcGFyYW1Db3VudCA9IHRlbXBbMF07CisJCShuZXcgRW1mYXRpY0FTVE5vZGVWaXNpdG9yKCkgeworCisJCQlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KEtleUVxdWFsc1ZhbHVlIGtleUVxdWFsc1ZhbHVlKSB7CisJCQkJcGFyYW1JbmRleCsrOworCQkJCVN0cmluZyBrZXk7CisJCQkJU3RyaW5nIHZhbHVlOworCQkJCWlmIChrZXlFcXVhbHNWYWx1ZS5nZXRFcXVhbHMoKSAhPSBudWxsKSB7CisJCQkJCWtleSA9IGdldFZhbHVlKGtleUVxdWFsc1ZhbHVlLmdldEtleSgpKTsKKwkJCQkJdmFsdWUgPSBnZXRWYWx1ZShrZXlFcXVhbHNWYWx1ZS5nZXRWYWx1ZSgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlrZXkgPSBfYW5ub3RhdGlvbk1hcC5nZXRJbXBsaWNpdEtleU5hbWUoZUFubm90YXRpb24uZ2V0U291cmNlKCksIHBhcmFtSW5kZXgsIHBhcmFtQ291bnQpOworCQkJCQlpZiAoa2V5ID09IG51bGwpIHsKKwkJCQkJCWtleSA9ICJ2YWx1ZSI7CisJCQkJCQlpZiAocGFyYW1JbmRleCA+IDApCisJCQkJCQkJa2V5ID0ga2V5ICsgSW50ZWdlci50b1N0cmluZyhwYXJhbUluZGV4ICsgMSk7CisJCQkJCQlsb2dXYXJuaW5nKG5ldyBFbWZhdGljU2VtYW50aWNXYXJuaW5nLlVua25vd25BdHRyaWJ1dGVJbXBsaWNpdEtleShrZXlFcXVhbHNWYWx1ZSwga2V5KSk7CisJCQkJCX0KKwkJCQkJdmFsdWUgPSBnZXRWYWx1ZShrZXlFcXVhbHNWYWx1ZS5nZXRLZXkoKSk7CisJCQkJfQorCQkJCWVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoa2V5LCB2YWx1ZSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlpbnQgcGFyYW1JbmRleDsKKworCQkJeworCQkJCXBhcmFtSW5kZXggPSAtMTsKKwkJCX0KKwkJfSkudmlzaXQoYW5ub3RhdGlvbik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYWNrYWdlTmFtZXNwYWNlQW5ub3RhdGlvbihBbm5vdGF0aW9uIG5hbWVzcGFjZUFubm90YXRpb24sIGZpbmFsIEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJICAgIAorCSAgICBuZXcgRW1mYXRpY0FTVE5vZGVWaXNpdG9yKCkgeworCSAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KEtleUVxdWFsc1ZhbHVlIGtleUVxdWFsc1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbHVlKGtleUVxdWFsc1ZhbHVlLmdldEtleSgpKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFZhbHVlKGtleUVxdWFsc1ZhbHVlLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChFbWZhdGljQW5ub3RhdGlvbk1hcC5FUEFDS0FHRV9OU1BSRUZJWF9LRVkuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZVBhY2thZ2Uuc2V0TnNQcmVmaXgodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChFbWZhdGljQW5ub3RhdGlvbk1hcC5FUEFDS0FHRV9OU1VSSV9LRVkuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZVBhY2thZ2Uuc2V0TnNVUkkodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nV2FybmluZyhuZXcgRW1mYXRpY1NlbWFudGljV2FybmluZy5Vbmtub3duRVBhY2thZ2VOYW1lc3BhY2VBdHRyaWJ1dGVLZXkoa2V5RXF1YWxzVmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisJICAgIH0udmlzaXQobmFtZXNwYWNlQW5ub3RhdGlvbik7CisJICAgIAorCX0KKworCQorCS8vCisJLy8gTW9kaWZpZXJzCisJLy8KKwkKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc01vZGlmaWVycyhNb2RpZmllcnMgbW9kaWZpZXJzLCBmaW5hbCBFVHlwZWRFbGVtZW50IGVUeXBlZEVsZW1lbnQpIHsKKwkgICAgbmV3IEVtZmF0aWNBU1ROb2RlVmlzaXRvcigpIHsKKwkgICAgICAgIHB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoT3B0TmVnYXRlZE1vZGlmaWVyIG9wdE5lZ2F0ZWRNb2RpZmllcikgeworCSAgICAgICAgICAgIGJvb2xlYW4gbW9kaWZpZXJWYWx1ZSA9IChvcHROZWdhdGVkTW9kaWZpZXIuZ2V0QmFuZygpID09IG51bGwpOworCSAgICAgICAgICAgIFN0cmluZyBtb2RpZmllclRleHQgPSBvcHROZWdhdGVkTW9kaWZpZXIuZ2V0TW9kaWZpZXIoKS5nZXRUZXh0KCk7CisJICAgICAgICAgICAgCisJICAgICAgICAgICAgaWYgKG1vZGlmaWVyVGV4dC5lcXVhbHMoTW9kaWZpZXIuS1dfVU5JUVVFKSkgeworCSAgICAgICAgICAgICAgICBlVHlwZWRFbGVtZW50LnNldFVuaXF1ZShtb2RpZmllclZhbHVlKTsKKwkgICAgICAgICAgICB9CisJICAgICAgICAgICAgZWxzZSBpZiAobW9kaWZpZXJUZXh0LmVxdWFscyhNb2RpZmllci5LV19PUkRFUkVEKSkgeworCSAgICAgICAgICAgICAgICBlVHlwZWRFbGVtZW50LnNldE9yZGVyZWQobW9kaWZpZXJWYWx1ZSk7CisJICAgICAgICAgICAgfQorCSAgICAgICAgICAgIAorCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgICAgIH0KKwkgICAgfS52aXNpdChtb2RpZmllcnMpOworCSAgICAKKwkgICAgaWYgKGVUeXBlZEVsZW1lbnQgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKKwkgICAgICAgIHByb2Nlc3NNb2RpZmllcnNIZWxwZXIobW9kaWZpZXJzLCAoRVN0cnVjdHVyYWxGZWF0dXJlKWVUeXBlZEVsZW1lbnQpOworCSAgICB9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NNb2RpZmllcnNIZWxwZXIoTW9kaWZpZXJzIG1vZGlmaWVycywgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSkgeworCSAgICBuZXcgRW1mYXRpY0FTVE5vZGVWaXNpdG9yKCkgeworCSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChPcHROZWdhdGVkTW9kaWZpZXIgb3B0TmVnYXRlZE1vZGlmaWVyKSB7CisJICAgICAgICAgICAgYm9vbGVhbiBtb2RpZmllclZhbHVlID0gKG9wdE5lZ2F0ZWRNb2RpZmllci5nZXRCYW5nKCkgPT0gbnVsbCk7CisJICAgICAgICAgICAgU3RyaW5nIG1vZGlmaWVyVGV4dCA9IG9wdE5lZ2F0ZWRNb2RpZmllci5nZXRNb2RpZmllcigpLmdldFRleHQoKTsKKwkgICAgICAgICAgICAKKwkgICAgICAgICAgICBpZiAobW9kaWZpZXJUZXh0LmVxdWFscyhNb2RpZmllci5LV19SRUFET05MWSkpIHsKKwkgICAgICAgICAgICAgICAgZVN0cnVjdHVyYWxGZWF0dXJlLnNldENoYW5nZWFibGUoIW1vZGlmaWVyVmFsdWUpOworCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICBlbHNlIGlmIChtb2RpZmllclRleHQuZXF1YWxzKE1vZGlmaWVyLktXX1ZPTEFUSUxFKSkgeworCSAgICAgICAgICAgICAgICBlU3RydWN0dXJhbEZlYXR1cmUuc2V0Vm9sYXRpbGUobW9kaWZpZXJWYWx1ZSk7CisJICAgICAgICAgICAgfQorCSAgICAgICAgICAgIGVsc2UgaWYgKG1vZGlmaWVyVGV4dC5lcXVhbHMoTW9kaWZpZXIuS1dfVFJBTlNJRU5UKSkgeworCSAgICAgICAgICAgICAgICBlU3RydWN0dXJhbEZlYXR1cmUuc2V0VHJhbnNpZW50KG1vZGlmaWVyVmFsdWUpOworCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICBlbHNlIGlmIChtb2RpZmllclRleHQuZXF1YWxzKE1vZGlmaWVyLktXX1VOU0VUVEFCTEUpKSB7CisJICAgICAgICAgICAgICAgIGVTdHJ1Y3R1cmFsRmVhdHVyZS5zZXRVbnNldHRhYmxlKG1vZGlmaWVyVmFsdWUpOworCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICBlbHNlIGlmIChtb2RpZmllclRleHQuZXF1YWxzKE1vZGlmaWVyLktXX0RFUklWRUQpKSB7CisJICAgICAgICAgICAgICAgIGVTdHJ1Y3R1cmFsRmVhdHVyZS5zZXREZXJpdmVkKG1vZGlmaWVyVmFsdWUpOworCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICBlbHNlIGlmIChtb2RpZmllclRleHQuZXF1YWxzKE1vZGlmaWVyLktXX0lEKSkgeworCSAgICAgICAgICAgICAgICBpZiAoZVN0cnVjdHVyYWxGZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgeworCSAgICAgICAgICAgICAgICAgICAgRUF0dHJpYnV0ZSBlQXR0cmlidXRlID0gKEVBdHRyaWJ1dGUpZVN0cnVjdHVyYWxGZWF0dXJlOworCSAgICAgICAgICAgICAgICAgICAgZUF0dHJpYnV0ZS5zZXRJRChtb2RpZmllclZhbHVlKTsKKwkgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgIH0KKwkgICAgICAgICAgICBlbHNlIGlmIChtb2RpZmllclRleHQuZXF1YWxzKE1vZGlmaWVyLktXX1JFU09MVkUpKSB7CisJICAgICAgICAgICAgICAgIGlmIChlU3RydWN0dXJhbEZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7CisJICAgICAgICAgICAgICAgICAgICBFUmVmZXJlbmNlIGVSZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSllU3RydWN0dXJhbEZlYXR1cmU7CisJICAgICAgICAgICAgICAgICAgICBlUmVmZXJlbmNlLnNldFJlc29sdmVQcm94aWVzKG1vZGlmaWVyVmFsdWUpOworCSAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgfQorCSAgICAgICAgICAgIAorCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKwkgICAgICAgIH0KKwkgICAgfS52aXNpdChtb2RpZmllcnMpOworCSAgICAKKwl9CisKKwkJcHJvdGVjdGVkIE9uZVRvT25lTWFwPEFTVE5vZGUsIEVPYmplY3Q+IGdldENzdERlY2wyRWNvcmVBU1RNYXAoKSB7CisJCXJldHVybiBjc3REZWNsMkVjb3JlQVNUOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyYXRvci9lY29yZS9Db25uZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmF0b3IvZWNvcmUvQ29ubmVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5ZGJiZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmF0b3IvZWNvcmUvQ29ubmVjdG9yLmphdmEKQEAgLTAsMCArMSw2NDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FR2VuZXJpY1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmljcy51dGlsLkdlbmVyaWNzVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyaWNzLnV0aWwuT25lVG9NYW55TWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJpY3MudXRpbC5PbmVUb09uZU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQm91bmRFeGNlcHRXaWxkY2FyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5DbGFzc0RlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQ29tcFVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW1mYXRpY0FTVE5vZGVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkltcG9ydFN0bXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuSW1wb3J0U3RtdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuTWFwRW50cnlEZWNsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0Lk11bHRpcGxpY2l0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5PbmVPck1vcmVUeXBlQXJnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5PcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuUGFyYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuUXVhbGlmaWVkSUQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlJlc3VsdFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuU3ViUGFja2FnZURlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuVG9wTGV2ZWxEZWNsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5UeXBlQXJnOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlR5cGVQYXJhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5UeXBlUGFyYW1zSW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5UeXBlV2l0aE11bHRpOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlZvaWRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuV2lsZGNhcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS51dGlsLkVtZmF0aWNCYXNpY1R5cGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLnBhcnNlci5QYXJzZUNvbnRleHQ7CisKKworCisvKioKKyAqIAorICogQGF1dGhvciBjamRhbHlAdXMuaWJtLmNvbQorICogQGF1dGhvciBtaWd1ZWwuZ2FyY2lhQHR1aGguZGUKKyAqLworIHB1YmxpYyBjbGFzcyBDb25uZWN0b3IgZXh0ZW5kcyBHZW5lcmF0aW9uUGhhc2UgeworCisJcHJpdmF0ZSBPbmVUb09uZU1hcDxBU1ROb2RlLCBFT2JqZWN0PiBjc3REZWNsMkVjb3JlQVNUID0gbnVsbDsKKwlwcml2YXRlIE9uZVRvTWFueU1hcDxFT2JqZWN0LCBBU1ROb2RlPiBlY29yZURlY2wyY3N0VXNlID0gbmV3IE9uZVRvTWFueU1hcDxFT2JqZWN0LCBBU1ROb2RlPigpOworCisJcHVibGljIENvbm5lY3RvcihCdWlsZGVyIGIpIHsKKwkJdGhpcy5jc3REZWNsMkVjb3JlQVNUID0gYi5nZXRDc3REZWNsMkVjb3JlQVNUTWFwKCk7CisJfQorCisJcHVibGljIHZvaWQgY29ubmVjdChQYXJzZUNvbnRleHQgcGFyc2VDb250ZXh0LCBSZXNvdXJjZSByZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCWVjb3JlRGVjbDJjc3RVc2UuY2xlYXIoKTsKKwkJaW5pdFBhcnNlQ29udGV4dChwYXJzZUNvbnRleHQpOworCQlDb21wVW5pdCBjb21wVW5pdCA9IChDb21wVW5pdCkgcGFyc2VDb250ZXh0LmdldFBhcnNlUm9vdCgpOworCQlfaW1wb3J0ZWRQYWNrYWdlcyA9IG5ldyBBcnJheUxpc3Q8RVBhY2thZ2U+KCk7CisJCV9pbXBvcnRlZFBhY2thZ2VzLmFkZChFY29yZVBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJZG9JbXBvcnRzKGNvbXBVbml0LmdldEltcG9ydFN0bXRzKCkpOworCQlFUGFja2FnZSBtYWluUGFja2FnZSA9IChFUGFja2FnZSkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7CisJCWRvUGFja2FnZShjb21wVW5pdC5nZXRUb3BMZXZlbERlY2xzKCksIG1haW5QYWNrYWdlKTsKKwkJY29tcFVuaXQuc2V0TWFwcyhjc3REZWNsMkVjb3JlQVNULCBlY29yZURlY2wyY3N0VXNlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZG9JbXBvcnRzKEltcG9ydFN0bXRzIGltcG9ydFN0bXRzKSB7CisJCWZpbmFsIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCQkobmV3IEVtZmF0aWNBU1ROb2RlVmlzaXRvcigpIHsKKworCQkJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChJbXBvcnRTdG10IGltcG9ydFN0bXQpIHsKKwkJCQlTdHJpbmcgdXJpVGV4dCA9IGdldFZhbHVlKGltcG9ydFN0bXQuZ2V0VXJpKCkpOworCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVRleHQpOworCQkJCVJlc291cmNlIHJlc291cmNlID0gdHJ5TG9hZFJlc291cmNlKHVyaSk7CisJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSAoRVBhY2thZ2UpIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOworCQkJCQlfaW1wb3J0ZWRQYWNrYWdlcy5hZGQoZVBhY2thZ2UpOworCQkJCX0gZWxzZSB7CisJCQkJCWxvZ0Vycm9yKG5ldyBFbWZhdGljU2VtYW50aWNFcnJvci5JbXBvcnROb3RGb3VuZChpbXBvcnRTdG10KSk7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcHJpdmF0ZSBSZXNvdXJjZSB0cnlMb2FkUmVzb3VyY2UoVVJJIHVyaSkgeworCQkJCXRyeSB7CisJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKKwkJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNMb2FkZWQoKSkKKwkJCQkJCXJldHVybiByZXNvdXJjZTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCX0pLnZpc2l0KGltcG9ydFN0bXRzKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZG9QYWNrYWdlKFRvcExldmVsRGVjbHMgdG9wTGV2ZWxEZWNscywgZmluYWwgRVBhY2thZ2UgZVBhY2thZ2UpIHsKKwkJKG5ldyBFbWZhdGljQVNUTm9kZVZpc2l0b3IoKSB7CisKKwkJCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoU3ViUGFja2FnZURlY2wgc3ViUGFja2FnZURlY2wpIHsKKwkJCQlTdHJpbmcgc3ViUGFja2FnZU5hbWUgPSBnZXRJRFRleHQoc3ViUGFja2FnZURlY2wuZ2V0TmFtZSgpKTsKKwkJCQlFUGFja2FnZSBzdWJQYWNrYWdlID0gZ2V0U3ViUGFja2FnZShlUGFja2FnZSwgc3ViUGFja2FnZU5hbWUpOworCQkJCWRvUGFja2FnZShzdWJQYWNrYWdlRGVjbC5nZXRUb3BMZXZlbERlY2xzKCksIHN1YlBhY2thZ2UpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChDbGFzc0RlY2wgY2xhc3NEZWNsKSB7CisJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldElEVGV4dChjbGFzc0RlY2wuZ2V0TmFtZSgpKTsKKwkJCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcykgZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoY2xhc3NOYW1lKTsKKwkJCQlkb0NsYXNzKGNsYXNzRGVjbCwgZUNsYXNzKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoTWFwRW50cnlEZWNsIG1hcEVudHJ5RGVjbCkgeworCQkJCVN0cmluZyBjbGFzc05hbWUgPSBnZXRJRFRleHQobWFwRW50cnlEZWNsLmdldE5hbWUoKSk7CisJCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVQYWNrYWdlLmdldEVDbGFzc2lmaWVyKGNsYXNzTmFtZSk7CisJCQkJZG9NYXBFbnRyeShtYXBFbnRyeURlY2wsIGVDbGFzcyk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCX0pLnZpc2l0KHRvcExldmVsRGVjbHMpOworCX0KKworCXByaXZhdGUgdm9pZCBkb0NsYXNzKENsYXNzRGVjbCBjbGFzc0RlY2wsIGZpbmFsIEVDbGFzcyBlQ2xhc3MpIHsKKwkJZmluYWwgRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKKworCQkvLyByZXNvbHZlIHRoZSBib3VuZHMgZm9yIGVhY2ggdHlwZSBwYXJhbQorCQlpZiAoY2xhc3NEZWNsLmdldFR5cGVQYXJhbXNJbmZvKCkgIT0gbnVsbCkgeworCQkJYWRkQm91bmRzVG9UeXBlUGFyYW1zKGNsYXNzRGVjbC5nZXRUeXBlUGFyYW1zSW5mbygpLCBlQ2xhc3MuZ2V0RVR5cGVQYXJhbWV0ZXJzKCksIGVQYWNrYWdlKTsKKwkJfQorCisJCWlmIChjbGFzc0RlY2wuZ2V0U3VwZXJUeXBlcygpICE9IG51bGwpCisJCQkobmV3IEVtZmF0aWNBU1ROb2RlVmlzaXRvcigpIHsKKworCQkJCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoQm91bmRFeGNlcHRXaWxkY2FyZCBiZXcpIHsKKwkJCQkJTGlzdDxFVHlwZVBhcmFtZXRlcj4gdmlzaWJsZVRQcyA9IGVDbGFzcy5nZXRFVHlwZVBhcmFtZXRlcnMoKTsKKwkJCQkJLy8gYWRkIEFTVCBub2RlcyBmb3Igc3VwZXIgdHlwZXMKKwkJCQkJRUdlbmVyaWNUeXBlIHN1cGVyVHlwZSA9IHJlc29sdmUoZVBhY2thZ2UsIGJldywgdmlzaWJsZVRQcyk7CisJCQkJCWlmIChzdXBlclR5cGUgIT0gbnVsbCkgeworCQkJCQkJcGxhY2VCZXdJbkJpZ01hcChiZXcsIHN1cGVyVHlwZSk7CisJCQkJCQlFQ2xhc3NpZmllciBzdXBlckNsYXNzID0gc3VwZXJUeXBlLmdldEVDbGFzc2lmaWVyKCk7CisJCQkJCQlpZiAoR2VuZXJpY3NVdGlsLmlzUmVmVG9DbGFzc2lmaWVyKHN1cGVyVHlwZSkpIHsKKwkJCQkJCQlpZiAoc3VwZXJDbGFzcyBpbnN0YW5jZW9mIEVDbGFzcykgeworCQkJCQkJCQllQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoKEVDbGFzcylzdXBlckNsYXNzKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlRdWFsaWZpZWRJRCBxdWFsaWZpZWRJRCA9IGJldy5nZXRSYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSgpOworCQkJCQkJCQlsb2dFcnJvcihuZXcgRW1mYXRpY1NlbWFudGljRXJyb3IuSWxsZWdhbFN1cGVyQ2xhc3NLaW5kKHF1YWxpZmllZElEKSk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQllQ2xhc3MuZ2V0RUdlbmVyaWNTdXBlclR5cGVzKCkuYWRkKHN1cGVyVHlwZSk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlRdWFsaWZpZWRJRCBxdWFsaWZpZWRJRCA9IGJldy5nZXRSYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSgpOworCQkJCQkJbG9nRXJyb3IobmV3IEVtZmF0aWNTZW1hbnRpY0Vycm9yLklsbGVnYWxTdXBlckNsYXNzS2luZChxdWFsaWZpZWRJRCkpOworCQkJCQl9CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisKKwkJCX0pLnZpc2l0KGNsYXNzRGVjbC5nZXRTdXBlclR5cGVzKCkpOworCQkobmV3IEVtZmF0aWNBU1ROb2RlVmlzaXRvcigpIHsKKworCQkJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCQkJU3RyaW5nIGF0dHJOYW1lID0gZ2V0SURUZXh0KGF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQkJCUVBdHRyaWJ1dGUgZUF0dHIgPSAoRUF0dHJpYnV0ZSkgZUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShhdHRyTmFtZSk7CisJCQkJZG9BdHRyaWJ1dGUoYXR0cmlidXRlLCBlQXR0ciwgZVBhY2thZ2UpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJCQkJU3RyaW5nIHJlZk5hbWUgPSBnZXRJRFRleHQocmVmZXJlbmNlLmdldE5hbWUoKSk7CisJCQkJRVJlZmVyZW5jZSBlUmVmID0gKEVSZWZlcmVuY2UpIGVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmUocmVmTmFtZSk7CisJCQkJZG9SZWZlcmVuY2UocmVmZXJlbmNlLCBlUmVmLCBlUGFja2FnZSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKKwkJCQlTdHJpbmcgb3BOYW1lID0gZ2V0SURUZXh0KG9wZXJhdGlvbi5nZXROYW1lKCkpOworCQkJCUVPcGVyYXRpb24gZU9wID0gZ2V0T3BlcmF0aW9uKGVDbGFzcywgb3BOYW1lKTsKKwkJCQlkb09wZXJhdGlvbihvcGVyYXRpb24sIGVPcCwgZVBhY2thZ2UpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQl9KS52aXNpdChjbGFzc0RlY2wuZ2V0Q2xhc3NNZW1iZXJEZWNscygpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkQm91bmRzVG9UeXBlUGFyYW1zKGZpbmFsIFR5cGVQYXJhbXNJbmZvIHRwaSwgZmluYWwgTGlzdDxFVHlwZVBhcmFtZXRlcj4gdmlzaWJsZVRQcywKKwkJCWZpbmFsIEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJCW5ldyBFbWZhdGljQVNUTm9kZVZpc2l0b3IoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoVHlwZVBhcmFtIHRwKSB7CisJCQkJU3RyaW5nIHRwMiA9IFRva2VuVGV4dC5HZXQodHAuZ2V0VHlwZVZhck5hbWUoKSkudHJpbSgpOworCQkJCWlmICh0cC5nZXRUeXBlQm91bmRzSW5mbygpICE9IG51bGwpIHsKKwkJCQkJZm9yIChBU1ROb2RlIHRiTiA6IHRwLmdldFR5cGVCb3VuZHNJbmZvKCkuZ2V0T25lT3JNb3JlVHlwZVBhcmFtQm91bmRzKCkuZ2V0Q2hpbGRyZW4oKSkgeworCQkJCQkJaWYgKHRiTiBpbnN0YW5jZW9mIEJvdW5kRXhjZXB0V2lsZGNhcmQpIHsKKwkJCQkJCQlCb3VuZEV4Y2VwdFdpbGRjYXJkIGJldyA9IChCb3VuZEV4Y2VwdFdpbGRjYXJkKSB0Yk47CisJCQkJCQkJRUdlbmVyaWNUeXBlIGVUUEJvdW5kID0gcmVzb2x2ZShlUGFja2FnZSwgYmV3LCB2aXNpYmxlVFBzKTsKKwkJCQkJCQlwbGFjZUJld0luQmlnTWFwKGJldywgZVRQQm91bmQpOworCQkJCQkJCVN0cmluZyB0dk5hbWUgPSBnZXRJRFRleHQodHAuZ2V0VHlwZVZhck5hbWUoKSk7CisJCQkJCQkJRVR5cGVQYXJhbWV0ZXIgZVRQID0gbG9va3VwKHR2TmFtZSwgdmlzaWJsZVRQcyk7CisJCQkJCQkJZVRQLmdldEVCb3VuZHMoKS5hZGQoZVRQQm91bmQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfS52aXNpdCh0cGkuZ2V0T25lT3JNb3JlVHlwZVBhcmFtcygpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZG9NYXBFbnRyeShNYXBFbnRyeURlY2wgbWFwRW50cnlEZWNsLCBFQ2xhc3MgZUNsYXNzKSB7CisJCWRvTWFwRW50cnlQYXJ0KCJrZXkiLCBtYXBFbnRyeURlY2wuZ2V0S2V5KCksIGVDbGFzcyk7CisJCWRvTWFwRW50cnlQYXJ0KCJ2YWx1ZSIsIG1hcEVudHJ5RGVjbC5nZXRWYWx1ZSgpLCBlQ2xhc3MpOworCX0KKworCXByaXZhdGUgdm9pZCBkb01hcEVudHJ5UGFydChTdHJpbmcgcGFydE5hbWUsIFR5cGVXaXRoTXVsdGkgcGFydFR5cGVXaXRoTXVsdGksIEVDbGFzcyBlQ2xhc3MpIHsKKwkJUXVhbGlmaWVkSUQgcXVhbGlmaWVkSUQgPSBnZXRRdWFsaWZpZWRJRChwYXJ0VHlwZVdpdGhNdWx0aSk7CisJCU11bHRpcGxpY2l0eSBtdWx0aXBsaWNpdHkgPSBwYXJ0VHlwZVdpdGhNdWx0aS5nZXRNdWx0aXBsaWNpdHkoKTsKKwkJRUNsYXNzaWZpZXIgcmVmVHlwZSA9IHJlc29sdmUoZUNsYXNzLmdldEVQYWNrYWdlKCksIHF1YWxpZmllZElEKTsKKwkJQm91bmRFeGNlcHRXaWxkY2FyZCBiZXcgPSBwYXJ0VHlwZVdpdGhNdWx0aS5nZXROYW1lKCk7CisJCUVHZW5lcmljVHlwZSBlUmVmVHlwZSA9IHJlc29sdmUoZUNsYXNzLmdldEVQYWNrYWdlKCksIGJldywgZUNsYXNzLmdldEVUeXBlUGFyYW1ldGVycygpKTsKKwkJaWYgKHJlZlR5cGUgIT0gbnVsbCkgeworCQkJcGxhY2VCZXdJbkJpZ01hcChiZXcsIGVSZWZUeXBlKTsKKwkJCWlmIChyZWZUeXBlIGluc3RhbmNlb2YgRURhdGFUeXBlKSB7CisJCQkJRUF0dHJpYnV0ZSBlQXR0ciA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUF0dHJpYnV0ZSgpOworCQkJCWVBdHRyLnNldE5hbWUocGFydE5hbWUpOworCQkJCWVBdHRyLnNldEVHZW5lcmljVHlwZShlUmVmVHlwZSk7CisJCQkJc2V0TXVsdGlwbGljaXR5KG11bHRpcGxpY2l0eSwgZUF0dHIpOworCQkJCWVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuYWRkKGVBdHRyKTsKKwkJCQkvKgorCQkJCSAqIHRoaXMgY29ycmVzcG9uZGVuY2UgaXMgbmVjZXNzYXJ5IGluIGFkZGl0aW9uIHRvIHRoYXQgZm9yIHR5cGUKKwkJCQkgKiBvZiBhdHRyCisJCQkJICovCisJCQkJY3N0RGVjbDJFY29yZUFTVC5wdXQocGFydFR5cGVXaXRoTXVsdGkuZ2V0UGFyZW50KCksIGVBdHRyKTsKKwkJCX0gZWxzZSB7CisJCQkJRVJlZmVyZW5jZSBlUmVmID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFUmVmZXJlbmNlKCk7CisJCQkJZVJlZi5zZXROYW1lKHBhcnROYW1lKTsKKwkJCQllUmVmLnNldEVHZW5lcmljVHlwZShlUmVmVHlwZSk7CisJCQkJc2V0TXVsdGlwbGljaXR5KG11bHRpcGxpY2l0eSwgZVJlZik7CisJCQkJZUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5hZGQoZVJlZik7CisJCQkJLyoKKwkJCQkgKiB0aGlzIGNvcnJlc3BvbmRlbmNlIGlzIG5lY2Vzc2FyeSBpbiBhZGRpdGlvbiB0byB0aGF0IGZvciB0eXBlCisJCQkJICogb2YgYXR0cgorCQkJCSAqLworCQkJCWNzdERlY2wyRWNvcmVBU1QucHV0KHBhcnRUeXBlV2l0aE11bHRpLmdldFBhcmVudCgpLCBlUmVmKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZ0Vycm9yKG5ldyBFbWZhdGljU2VtYW50aWNFcnJvci5JbGxlZ2FsQXR0cmlidXRlS2luZChxdWFsaWZpZWRJRCkpOworCQl9CisJfQorCisJcHJpdmF0ZSBRdWFsaWZpZWRJRCBnZXRRdWFsaWZpZWRJRChUeXBlV2l0aE11bHRpIHR3bSkgeworCQlRdWFsaWZpZWRJRCBxdWFsaWZpZWRJRCA9IHR3bS5nZXROYW1lKCkuZ2V0UmF3VE5hbWVPclRWYXJPclBhcmFtemVkVE5hbWUoKTsKKwkJcmV0dXJuIHF1YWxpZmllZElEOworCX0KKworCXByaXZhdGUgdm9pZCBkb0F0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cmlidXRlLCBFQXR0cmlidXRlIGVBdHRyLCBFUGFja2FnZSBlUGFja2FnZSkgeworCQlCb3VuZEV4Y2VwdFdpbGRjYXJkIGJldyA9IGF0dHJpYnV0ZS5nZXRUeXBlV2l0aE11bHRpKCkuZ2V0TmFtZSgpOworCQlMaXN0PEVUeXBlUGFyYW1ldGVyPiB2aXNpYmxlVFBzID0gZUF0dHIuZ2V0RUNvbnRhaW5pbmdDbGFzcygpLmdldEVUeXBlUGFyYW1ldGVycygpOworCQlFR2VuZXJpY1R5cGUgcmVmVHlwZSA9IHJlc29sdmUoZVBhY2thZ2UsIGJldywgdmlzaWJsZVRQcyk7CisJCWlmIChyZWZUeXBlICE9IG51bGwpIHsKKwkJCUVDbGFzc2lmaWVyIHJlZmVkQ2xhc3NpZmllciA9IHJlZlR5cGUuZ2V0RUNsYXNzaWZpZXIoKTsKKwkJCS8qCisJCQkgKiByZWZUeXBlIG1heSByZWZlciB0byBhIHR5cGUgcGFyYW0uIEhvd2V2ZXIgaWYgaXQgcmVmZXJzIHRvIGFuCisJCQkgKiBFQ2xhc3NpZmllciBpdCBiZXR0ZXIgYmUgYW4gRURhdGFUeXBlIQorCQkJICovCisJCQlpZiAoKHJlZmVkQ2xhc3NpZmllciAhPSBudWxsKSAmJiAhKHJlZmVkQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVEYXRhVHlwZSkpIHsKKwkJCQlRdWFsaWZpZWRJRCBxaWQgPSBiZXcuZ2V0UmF3VE5hbWVPclRWYXJPclBhcmFtemVkVE5hbWUoKTsKKwkJCQlsb2dFcnJvcihuZXcgRW1mYXRpY1NlbWFudGljRXJyb3IuSWxsZWdhbEF0dHJpYnV0ZUtpbmQocWlkKSk7CisJCQl9IGVsc2UgeworCQkJCWVBdHRyLnNldEVHZW5lcmljVHlwZShyZWZUeXBlKTsKKwkJCQlwbGFjZUJld0luQmlnTWFwKGJldywgcmVmVHlwZSk7CisJCQl9CisJCX0KKwkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGdldFZhbHVlKGF0dHJpYnV0ZS5nZXREZWZhdWx0VmFsdWVFeHByKCkpOworCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpCisJCQllQXR0ci5zZXREZWZhdWx0VmFsdWVMaXRlcmFsKGRlZmF1bHRWYWx1ZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRvUmVmZXJlbmNlKFJlZmVyZW5jZSByZWZlcmVuY2UsIEVSZWZlcmVuY2UgZVJlZiwgRVBhY2thZ2UgZVBhY2thZ2UpIHsKKwkJQm91bmRFeGNlcHRXaWxkY2FyZCBiZXcgPSByZWZlcmVuY2UuZ2V0VHlwZVdpdGhNdWx0aSgpLmdldE5hbWUoKTsKKwkJTGlzdDxFVHlwZVBhcmFtZXRlcj4gdmlzaWJsZVRQcyA9IGVSZWYuZ2V0RUNvbnRhaW5pbmdDbGFzcygpLmdldEVUeXBlUGFyYW1ldGVycygpOworCQlFR2VuZXJpY1R5cGUgcmVmVHlwZSA9IHJlc29sdmUoZVBhY2thZ2UsIGJldywgdmlzaWJsZVRQcyk7CisJCVF1YWxpZmllZElEIHF1YWxpZmllZElEID0gYmV3LmdldFJhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lKCk7CisJCWlmIChyZWZUeXBlICE9IG51bGwpIHsKKwkJCXBsYWNlQmV3SW5CaWdNYXAoYmV3LCByZWZUeXBlKTsKKwkJCWVSZWYuc2V0RUdlbmVyaWNUeXBlKHJlZlR5cGUpOworCQkJLy8gY29tcHV0ZSBvcHBvc2l0ZU5hbWUgaWYgbm90IHBvaW50aW5nIHRvIGEgdHlwZSBwYXJhbQorCQkJRUNsYXNzaWZpZXIgcmVmZWRDbGFzc2lmaWVyID0gcmVmVHlwZS5nZXRFQ2xhc3NpZmllcigpOworCQkJaWYgKCJ2YWwiLmVxdWFscyhyZWZlcmVuY2UuZ2V0UmVmZXJlbmNlS2luZCgpLmdldFRleHQoKSkpIHsKKwkJCQllUmVmLnNldENvbnRhaW5tZW50KHRydWUpOworCQkJfQorCQkJaWYgKChyZWZlZENsYXNzaWZpZXIgIT0gbnVsbCkgJiYgKHJlZmVkQ2xhc3NpZmllciBpbnN0YW5jZW9mIEVDbGFzcykpIHsKKwkJCQlTdHJpbmcgb3Bwb3NpdGVOYW1lID0gbnVsbDsKKwkJCQlpZiAocmVmZXJlbmNlLmdldE9wcG9zaXRlTmFtZSgpICE9IG51bGwpIHsKKwkJCQkJb3Bwb3NpdGVOYW1lID0gZ2V0SURUZXh0KHJlZmVyZW5jZS5nZXRPcHBvc2l0ZU5hbWUoKSk7CisJCQkJCUVDbGFzcyByZWZUeXBlQ2xhc3MgPSAoRUNsYXNzKSByZWZlZENsYXNzaWZpZXI7CisJCQkJCUVSZWZlcmVuY2Ugb3Bwb3NpdGUgPSAoRVJlZmVyZW5jZSkgcmVmVHlwZUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShvcHBvc2l0ZU5hbWUpOworCQkJCQllY29yZURlY2wyY3N0VXNlLnB1dChvcHBvc2l0ZSwgcmVmZXJlbmNlLmdldE9wcG9zaXRlTmFtZSgpKTsKKwkJCQkJZVJlZi5zZXRFT3Bwb3NpdGUob3Bwb3NpdGUpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWxvZ0Vycm9yKG5ldyBFbWZhdGljU2VtYW50aWNFcnJvci5OYW1lUmVzb2x1dGlvbkZhaWx1cmUocXVhbGlmaWVkSUQpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBkb09wZXJhdGlvbihmaW5hbCBPcGVyYXRpb24gb3BlcmF0aW9uLCBmaW5hbCBFT3BlcmF0aW9uIGVPcCwgZmluYWwgRVBhY2thZ2UgZVBhY2thZ2UpIHsKKworCQkvLyByZXNvbHZlIHRoZSBib3VuZHMgZm9yIGVhY2ggdHlwZSBwYXJhbQorCQlpZiAob3BlcmF0aW9uLmdldFR5cGVQYXJhbXNJbmZvKCkgIT0gbnVsbCkgeworCQkJTGlzdDxFVHlwZVBhcmFtZXRlcj4gdmlzaWJsZVRQcyA9IHZpc2libGVUeXBlUGFyYW1zKGVPcCk7CisJCQlhZGRCb3VuZHNUb1R5cGVQYXJhbXMob3BlcmF0aW9uLmdldFR5cGVQYXJhbXNJbmZvKCksIHZpc2libGVUUHMsIGVQYWNrYWdlKTsKKwkJfQorCisJCVJlc3VsdFR5cGUgdCA9IG9wZXJhdGlvbi5nZXRSZXNUeXBlKCk7CisJCWlmICh0IGluc3RhbmNlb2YgVm9pZENvbnRhaW5lcikgeworCQkJLy8gdGhlIHJldHVybiB0eXBlIG9mIGVPcCBpcyB2b2lkCisJCQllT3Auc2V0RVR5cGUobnVsbCk7CisJCX0gZWxzZSB7CisJCQlUeXBlV2l0aE11bHRpIHR3bSA9IChUeXBlV2l0aE11bHRpKSB0OworCQkJQm91bmRFeGNlcHRXaWxkY2FyZCBiZXcgPSB0d20uZ2V0TmFtZSgpOworCQkJTGlzdDxFVHlwZVBhcmFtZXRlcj4gdmlzaWJsZVRQcyA9IHZpc2libGVUeXBlUGFyYW1zKGVPcCk7CisJCQlFR2VuZXJpY1R5cGUgcmVmVHlwZSA9IHJlc29sdmUoZVBhY2thZ2UsIGJldywgdmlzaWJsZVRQcyk7CisJCQlpZiAocmVmVHlwZSAhPSBudWxsKSB7CisJCQkJcGxhY2VCZXdJbkJpZ01hcChiZXcsIHJlZlR5cGUpOworCQkJCWVPcC5zZXRFR2VuZXJpY1R5cGUocmVmVHlwZSk7CisJCQl9CisJCX0KKwkJaWYgKG9wZXJhdGlvbi5nZXRQYXJhbXMoKSAhPSBudWxsKQorCQkJKG5ldyBFbWZhdGljQVNUTm9kZVZpc2l0b3IoKSB7CisKKwkJCQlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFBhcmFtIHBhcmFtKSB7CisJCQkJCUJvdW5kRXhjZXB0V2lsZGNhcmQgYmV3ID0gcGFyYW0uZ2V0VHlwZVdpdGhNdWx0aSgpLmdldE5hbWUoKTsKKwkJCQkJTGlzdDxFVHlwZVBhcmFtZXRlcj4gdmlzaWJsZVRQcyA9IHZpc2libGVUeXBlUGFyYW1zKGVPcCk7CisJCQkJCUVHZW5lcmljVHlwZSBwYXJhbVJlZlR5cGUgPSByZXNvbHZlKGVQYWNrYWdlLCBiZXcsIHZpc2libGVUUHMpOworCQkJCQlpZiAocGFyYW1SZWZUeXBlICE9IG51bGwpIHsKKwkJCQkJCXBsYWNlQmV3SW5CaWdNYXAoYmV3LCBwYXJhbVJlZlR5cGUpOworCQkJCQkJU3RyaW5nIHBhcmFtTmFtZSA9IGdldElEVGV4dChwYXJhbS5nZXROYW1lKCkpOworCQkJCQkJRVBhcmFtZXRlciBlUGFyYW0gPSBnZXRQYXJhbShlT3AsIHBhcmFtTmFtZSk7CisJCQkJCQlpZiAoZVBhcmFtICE9IG51bGwpCisJCQkJCQkJZVBhcmFtLnNldEVHZW5lcmljVHlwZShwYXJhbVJlZlR5cGUpOworCQkJCQl9CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisKKwkJCX0pLnZpc2l0KG9wZXJhdGlvbi5nZXRQYXJhbXMoKSk7CisJCWlmIChvcGVyYXRpb24uZ2V0RXhjZXB0aW9ucygpICE9IG51bGwpCisJCQkobmV3IEVtZmF0aWNBU1ROb2RlVmlzaXRvcigpIHsKKworCQkJCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoQm91bmRFeGNlcHRXaWxkY2FyZCBiZXcpIHsKKwkJCQkJTGlzdDxFVHlwZVBhcmFtZXRlcj4gdmlzaWJsZVRQcyA9IHZpc2libGVUeXBlUGFyYW1zKGVPcCk7CisJCQkJCUVHZW5lcmljVHlwZSBleGNlcHRpb25UeXBlID0gcmVzb2x2ZShlUGFja2FnZSwgYmV3LCB2aXNpYmxlVFBzKTsKKwkJCQkJaWYgKGV4Y2VwdGlvblR5cGUgIT0gbnVsbCkgeworCQkJCQkJcGxhY2VCZXdJbkJpZ01hcChiZXcsIGV4Y2VwdGlvblR5cGUpOworCQkJCQkJZU9wLmdldEVHZW5lcmljRXhjZXB0aW9ucygpLmFkZChleGNlcHRpb25UeXBlKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCisJCQl9KS52aXNpdChvcGVyYXRpb24uZ2V0RXhjZXB0aW9ucygpKTsKKwl9CisKKwkvKioKKwkgKiAoYSkgdGhlIHR5cGUgcGFyYW1zIGRlY2xhcmVkIGZvciB0aGUgb3BlcmF0aW9uIHBsdXMgKGIpIG9ubHkgdGhvc2UgZnJvbQorCSAqIHRoZSB0eXBlIHBhcmFtcyBzZWN0aW9uIG9mIHRoZSBjbGFzcyB3aG9zZSBuYW1lIGlzIG5vdCBhbW9uZyB0aG9zZSBpbiAoYSkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExpc3Q8RVR5cGVQYXJhbWV0ZXI+IHZpc2libGVUeXBlUGFyYW1zKEVPcGVyYXRpb24gZU9wKSB7CisJCUxpc3Q8RVR5cGVQYXJhbWV0ZXI+IHZpc2libGVUUHMgPSBuZXcgTGlua2VkTGlzdDxFVHlwZVBhcmFtZXRlcj4oKTsKKwkJdmlzaWJsZVRQcy5hZGRBbGwoZU9wLmdldEVUeXBlUGFyYW1ldGVycygpKTsKKwkJZm9yIChFVHlwZVBhcmFtZXRlciBjbGFzc1RQIDogZU9wLmdldEVDb250YWluaW5nQ2xhc3MoKS5nZXRFVHlwZVBhcmFtZXRlcnMoKSkgeworCQkJYm9vbGVhbiBoaWRkZW5CeU9wTGV2ZWxEZWNsID0gZmFsc2U7CisJCQlmb3IgKEVUeXBlUGFyYW1ldGVyIHZpc2libGVUUCA6IHZpc2libGVUUHMpIHsKKwkJCQlpZiAodmlzaWJsZVRQLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NUUC5nZXROYW1lKCkpKSB7CisJCQkJCWhpZGRlbkJ5T3BMZXZlbERlY2wgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCWlmICghaGlkZGVuQnlPcExldmVsRGVjbCkgeworCQkJCXZpc2libGVUUHMuYWRkKGNsYXNzVFApOworCQkJfQorCQl9CisJCXJldHVybiB2aXNpYmxlVFBzOworCX0KKworCXByaXZhdGUgRUNsYXNzaWZpZXIgcmVzb2x2ZShFUGFja2FnZSBjb250ZXh0LCBRdWFsaWZpZWRJRCBxdWFsaWZpZWRJRCkgeworCQlTdHJpbmcgcmF3UUlEVGV4dCA9IFRva2VuVGV4dC5HZXQocXVhbGlmaWVkSUQpOworCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IHJlc29sdmVIZWxwZXIoY29udGV4dCwgcXVhbGlmaWVkSUQpOworCQlpZiAoZUNsYXNzaWZpZXIgPT0gbnVsbCkKKwkJCWxvZ0Vycm9yKG5ldyBFbWZhdGljU2VtYW50aWNFcnJvci5OYW1lUmVzb2x1dGlvbkZhaWx1cmUocXVhbGlmaWVkSUQpKTsKKwkJcmV0dXJuIGVDbGFzc2lmaWVyOworCX0KKworCXByaXZhdGUgRUNsYXNzaWZpZXIgcmVzb2x2ZUhlbHBlcihFUGFja2FnZSBjb250ZXh0LCBRdWFsaWZpZWRJRCBxdWFsaWZpZWRJRCkgeworCQlTdHJpbmcgcmF3UUlEVGV4dCA9IFRva2VuVGV4dC5HZXQocXVhbGlmaWVkSUQpOworCQlpZiAocmF3UUlEVGV4dC5pbmRleE9mKCcuJykgPT0gLTEgJiYgcmF3UUlEVGV4dC5pbmRleE9mKCd+JykgPT0gLTEpIHsKKwkJCS8qCisJCQkgKiBiZWZvcmUgbG9va2luZyBhbW9uZyBidWlsdC1pbiB0eXBlcywgd2UgbG9vayBmb3IgYSBjbGFzc2lmaWVyIGluCisJCQkgKiB0aGUgc2FtZSBwYWNrYWdlCisJCQkgKi8KKwkJCUVDbGFzc2lmaWVyIGF0U2FtZVBhY2thZ2UgPSBjb250ZXh0LmdldEVDbGFzc2lmaWVyKHJhd1FJRFRleHQpOworCQkJaWYgKGF0U2FtZVBhY2thZ2UgIT0gbnVsbCkgeworCQkJCXJldHVybiBhdFNhbWVQYWNrYWdlOworCQkJfQorCisJCQlFQ2xhc3NpZmllciBiYXNpY1R5cGUgPSBFbWZhdGljQmFzaWNUeXBlcy5Mb29rdXBCYXNpY1R5cGUocmF3UUlEVGV4dCk7CisJCQlpZiAoYmFzaWNUeXBlICE9IG51bGwpCisJCQkJcmV0dXJuIGJhc2ljVHlwZTsKKwkJfQorCQlTdHJpbmcgcWlkVGV4dCA9IGdldElEVGV4dChxdWFsaWZpZWRJRCk7CisJCVN0cmluZyBpZFBhcnRzW10gPSBxaWRUZXh0LnNwbGl0KCJcXC4iKTsKKwkJZm9yIChFUGFja2FnZSBjdXJyZW50Q29udGV4dCA9IGNvbnRleHQ7IGN1cnJlbnRDb250ZXh0ICE9IG51bGw7IGN1cnJlbnRDb250ZXh0ID0gY3VycmVudENvbnRleHQKKwkJCQkuZ2V0RVN1cGVyUGFja2FnZSgpKSB7CisJCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IHJlc29sdmVIZWxwZXIoY3VycmVudENvbnRleHQsIGlkUGFydHMpOworCQkJaWYgKGVDbGFzc2lmaWVyICE9IG51bGwpCisJCQkJcmV0dXJuIGVDbGFzc2lmaWVyOworCQl9CisKKwkJZm9yIChJdGVyYXRvcjxFUGFja2FnZT4gaSA9IF9pbXBvcnRlZFBhY2thZ2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJRVBhY2thZ2UgaW1wb3J0ZWRQYWNrYWdlID0gaS5uZXh0KCk7CisJCQlTdHJpbmcgaW1wb3J0ZWRQYWNrYWdlTmFtZSA9IGltcG9ydGVkUGFja2FnZS5nZXROYW1lKCk7CisJCQlpZiAoaW1wb3J0ZWRQYWNrYWdlTmFtZS5sZW5ndGgoKSA8IHFpZFRleHQubGVuZ3RoKCkpIHsKKwkJCQlTdHJpbmcgcWlkVGV4dFN0YXJ0ID0gcWlkVGV4dC5zdWJzdHJpbmcoMCwgaW1wb3J0ZWRQYWNrYWdlTmFtZS5sZW5ndGgoKSk7CisJCQkJaWYgKHFpZFRleHRTdGFydC5lcXVhbHMoaW1wb3J0ZWRQYWNrYWdlTmFtZSkgJiYgcWlkVGV4dC5jaGFyQXQoaW1wb3J0ZWRQYWNrYWdlTmFtZS5sZW5ndGgoKSkgPT0gJy4nKSB7CisJCQkJCVN0cmluZyBxaWRUZXh0RW5kID0gcWlkVGV4dC5zdWJzdHJpbmcoaW1wb3J0ZWRQYWNrYWdlTmFtZS5sZW5ndGgoKSArIDEpOworCQkJCQlTdHJpbmcgcWlkVGV4dEVuZFBhcnRzW10gPSBxaWRUZXh0RW5kLnNwbGl0KCJcXC4iKTsKKwkJCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSByZXNvbHZlSGVscGVyKGltcG9ydGVkUGFja2FnZSwgcWlkVGV4dEVuZFBhcnRzKTsKKwkJCQkJaWYgKGVDbGFzc2lmaWVyICE9IG51bGwpCisJCQkJCQlyZXR1cm4gZUNsYXNzaWZpZXI7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBFQ2xhc3NpZmllciByZXNvbHZlSGVscGVyKEVQYWNrYWdlIGNvbnRleHQsIFN0cmluZyBpZFBhcnRzW10pIHsKKwkJaWYgKGlkUGFydHMubGVuZ3RoID09IDEpCisJCQlyZXR1cm4gY29udGV4dC5nZXRFQ2xhc3NpZmllcihpZFBhcnRzWzBdKTsKKwkJRVBhY2thZ2Ugc3ViUGFja2FnZSA9IGdldFN1YlBhY2thZ2UoY29udGV4dCwgaWRQYXJ0c1swXSk7CisJCWlmIChzdWJQYWNrYWdlICE9IG51bGwpIHsKKwkJCVN0cmluZyBzdWJQYXJ0c1tdID0gcmVtb3ZlRmlyc3QoaWRQYXJ0cyk7CisJCQlyZXR1cm4gcmVzb2x2ZUhlbHBlcihzdWJQYWNrYWdlLCBzdWJQYXJ0cyk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoZSBwcm9kdWN0aW9uIHJ1bGUgZm9yIEJvdW5kRXhjZXB0V2lsZGNhcmQgKGluIEd5bW5hc3Qgc3ludGF4KSBpczoKKwkgKiAKKwkgKiBzZXF1ZW5jZSBib3VuZEV4Y2VwdFdpbGRjYXJkIDogcmF3VE5hbWVPclRWYXJPclBhcmFtemVkVE5hbWU9cXVhbGlmaWVkSUQKKwkgKiAoTFQgb25lT3JNb3JlVHlwZUFyZ3MgR1QpPyA7CisJICogCisJICogVGhlIHF1YWxpZmllZCBuYW1lIG1heSBzdGFuZCBmb3IgYSB0eXBlIHZhcmlhYmxlLCBhIHJlZmVyZW5jZSB0byBhCisJICogbm9uLWdlbmVyaWMgdHlwZSwgYSByYXcgcmVmZXJlbmNlIHRvIGEgZ2VuZXJpYyB0eXBlLCBvciBhIHBhcmFtZXRlcml6ZWQKKwkgKiB0eXBlLiBTY29wZXMgYXJlIHRvIGJlIHNlYXJjaGVkIGluIHRoYXQgb3JkZXIuCisJICogCisJICovCisJcHJpdmF0ZSBFR2VuZXJpY1R5cGUgcmVzb2x2ZShFUGFja2FnZSBjb250ZXh0LCBCb3VuZEV4Y2VwdFdpbGRjYXJkIGJldywgTGlzdDxFVHlwZVBhcmFtZXRlcj4gdHlwZVBhcmFtc0luU2NvcGUpIHsKKwkJUXVhbGlmaWVkSUQgcXVhbGlmaWVkSUQgPSBiZXcuZ2V0UmF3VE5hbWVPclRWYXJPclBhcmFtemVkVE5hbWUoKTsKKwkJU3RyaW5nIHJhd1FJRFRleHQgPSBUb2tlblRleHQuR2V0KHF1YWxpZmllZElEKTsKKwkJaWYgKGJldy5nZXRPbmVPck1vcmVUeXBlQXJncygpID09IG51bGwpIHsKKwkJCS8qCisJCQkgKiBubyB0eXBlIGFyZ3M6IGVpdGhlciBhIHJlZiB0byBhIHR5cGUgdmFyLCByZWYgdG8gbm9uLWdlbmVyaWMKKwkJCSAqIHR5cGUsIG9yIHJhdyByZWZlcmVuY2UgdG8gZ2VuZXJpYyB0eXBlCisJCQkgKi8KKwkJCUVUeXBlUGFyYW1ldGVyIHJlZmVkVFAgPSBsb29rdXAocmF3UUlEVGV4dCwgdHlwZVBhcmFtc0luU2NvcGUpOworCQkJaWYgKHJlZmVkVFAgIT0gbnVsbCkgeworCQkJCUVHZW5lcmljVHlwZSBlZ3QgPSBHZW5lcmljc1V0aWwuZ2V0UmVmVG9UeXBlUGFyYW0ocmVmZWRUUCk7CisJCQkJcmV0dXJuIGVndDsKKwkJCX0KKwkJCS8vIGZhbGwgYmFjayB0bworCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSByZXNvbHZlSGVscGVyKGNvbnRleHQsIHF1YWxpZmllZElEKTsKKwkJCWlmIChlQ2xhc3NpZmllciA9PSBudWxsKSB7CisJCQkJbG9nRXJyb3IobmV3IEVtZmF0aWNTZW1hbnRpY0Vycm9yLk5hbWVSZXNvbHV0aW9uRmFpbHVyZShxdWFsaWZpZWRJRCkpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJcmV0dXJuIEdlbmVyaWNzVXRpbC5nZXRFR2VuZXJpY1R5cGUoZUNsYXNzaWZpZXIpOworCQl9IGVsc2UgeworCQkJLy8gdGhlcmUgYXJlIHR5cGUgYXJncywgaXQgaGFzIHRvIGJlIGEgcGFyYW1ldGVyaXplZCB0eXBlCisJCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IHJlc29sdmVIZWxwZXIoY29udGV4dCwgcXVhbGlmaWVkSUQpOworCQkJaWYgKGVDbGFzc2lmaWVyID09IG51bGwpIHsKKwkJCQlsb2dFcnJvcihuZXcgRW1mYXRpY1NlbWFudGljRXJyb3IuTmFtZVJlc29sdXRpb25GYWlsdXJlKHF1YWxpZmllZElEKSk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9IGVsc2UgeworCQkJCUVHZW5lcmljVHlwZSByZXMgPSBHZW5lcmljc1V0aWwuZ2V0RUdlbmVyaWNUeXBlKGVDbGFzc2lmaWVyKTsKKwkJCQkvLyBtYWtlIEFTVCBub2RlcyBmb3IgdHlwZSBhcmdzLCB3aWxkY2FyZHMgYXJlIGFsbG93ZWQKKwkJCQlPbmVPck1vcmVUeXBlQXJncyBvb210YXMgPSBiZXcuZ2V0T25lT3JNb3JlVHlwZUFyZ3MoKTsKKwkJCQlmb3IgKEFTVE5vZGUgdGFOIDogb29tdGFzLmdldENoaWxkcmVuKCkpIHsKKwkJCQkJaWYgKHRhTiBpbnN0YW5jZW9mIFR5cGVBcmcpIHsKKwkJCQkJCUVHZW5lcmljVHlwZSBuZXdUeXBlQXJnID0gbnVsbDsKKwkJCQkJCWlmICh0YU4gaW5zdGFuY2VvZiBCb3VuZEV4Y2VwdFdpbGRjYXJkKSB7CisJCQkJCQkJLy8gcmVjdXJzaXZlIGNhbGwKKwkJCQkJCQluZXdUeXBlQXJnID0gcmVzb2x2ZShjb250ZXh0LCAoQm91bmRFeGNlcHRXaWxkY2FyZCkgdGFOLCB0eXBlUGFyYW1zSW5TY29wZSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIG5vdCByZWN1cnNpdmUgY2FsbAorCQkJCQkJCW5ld1R5cGVBcmcgPSByZXNvbHZlKGNvbnRleHQsIChXaWxkY2FyZCkgdGFOLCB0eXBlUGFyYW1zSW5TY29wZSk7CisJCQkJCQl9CisJCQkJCQlpZiAobmV3VHlwZUFyZyAhPSBudWxsKSB7CisJCQkJCQkJcmVzLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKG5ld1R5cGVBcmcpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiByZXM7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIEVHZW5lcmljVHlwZSByZXNvbHZlKEVQYWNrYWdlIGNvbnRleHQsIFdpbGRjYXJkIHcsIExpc3Q8RVR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbXNJblNjb3BlKSB7CisJCUVHZW5lcmljVHlwZSByZXMgPSBudWxsOworCQlpZiAody5nZXRCb3VuZEV4Y2VwdFdpbGRjYXJkKCkgPT0gbnVsbCkgeworCQkJLy8gdW5ib3VuZGVkIHdpbGRjYXJkCisJCQlyZXMgPSBHZW5lcmljc1V0aWwuZ2V0VW5ib3VuZGVkV2lsZGNhcmQoKTsKKwkJCXJldHVybiByZXM7CisJCX0gZWxzZSB7CisJCQlCb3VuZEV4Y2VwdFdpbGRjYXJkIGJldyA9IHcuZ2V0Qm91bmRFeGNlcHRXaWxkY2FyZCgpOworCQkJRUdlbmVyaWNUeXBlIGIgPSByZXNvbHZlKGNvbnRleHQsIGJldywgdHlwZVBhcmFtc0luU2NvcGUpOworCQkJLy8gaW4gY2FzZSBiID09IG51bGwsIGVycm9yIHJlcG9ydGluZyBhbHJlYWR5IHBlcmZvcm1lZCBieSByZXNvbHZlCisJCQlpZiAoYiAhPSBudWxsKSB7CisJCQkJU3RyaW5nIGt3ID0gdy5nZXRFeHRlbmRzT3JTdXBlcigpLmdldFRleHQoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsKKwkJCQlpZiAoa3cuZXF1YWxzKCJleHRlbmRzIikpIHsKKwkJCQkJcmVzID0gR2VuZXJpY3NVdGlsLmdldFVwcGVyQm91bmRlZFdpbGRjYXJkKGIpOworCQkJCX0gZWxzZSB7CisJCQkJCXJlcyA9IEdlbmVyaWNzVXRpbC5nZXRMb3dlckJvdW5kZWRXaWxkY2FyZChiKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmdbXSByZW1vdmVGaXJzdChTdHJpbmcgaWRQYXJ0c1tdKSB7CisJCVN0cmluZyBzdWJQYXJ0c1tdID0gbmV3IFN0cmluZ1tpZFBhcnRzLmxlbmd0aCAtIDFdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YlBhcnRzLmxlbmd0aDsgaSsrKQorCQkJc3ViUGFydHNbaV0gPSBpZFBhcnRzW2kgKyAxXTsKKworCQlyZXR1cm4gc3ViUGFydHM7CisJfQorCisJcHJpdmF0ZSBBcnJheUxpc3Q8RVBhY2thZ2U+IF9pbXBvcnRlZFBhY2thZ2VzOworCisJcHVibGljIHN0YXRpYyBFVHlwZVBhcmFtZXRlciBsb29rdXAoU3RyaW5nIHR2TmFtZSwgTGlzdDxFVHlwZVBhcmFtZXRlcj4gZXRwcykgeworCQlmb3IgKEVUeXBlUGFyYW1ldGVyIHRwIDogZXRwcykgeworCQkJaWYgKHRwLmdldE5hbWUoKS5lcXVhbHModHZOYW1lKSkgeworCQkJCXJldHVybiB0cDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NpZmllcihFR2VuZXJpY1R5cGUgZWd0KSB7CisJCWlmIChlZ3QgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJvb2xlYW4gcmVzID0gKGVndC5nZXRFQ2xhc3NpZmllcigpICE9IG51bGwpICYmIChlZ3QuZ2V0RVR5cGVBcmd1bWVudHMoKS5zaXplKCkgPT0gMCkKKwkJCQkmJiAoZWd0LmdldEVUeXBlUGFyYW1ldGVyKCkgPT0gbnVsbCk7CisJCXJldHVybiByZXM7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBsYWNlQmV3SW5CaWdNYXAoZmluYWwgQm91bmRFeGNlcHRXaWxkY2FyZCBiZXcsIGZpbmFsIEVHZW5lcmljVHlwZSBndCkgeworCQlFT2JqZWN0IGVjb3JlRGVjbCA9IGdldEVjb3JlRGVjbEZvclR5cGVSZWYoZ3QpOworCQllY29yZURlY2wyY3N0VXNlLnB1dChlY29yZURlY2wsIGJldy5nZXRSYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSgpKTsKKwkJLyoKKwkJICogZG9pbmcgdGhlIGFib3ZlIGlzIG5vdCBlbm91Z2ggYXMgd2Ugd2FudCBoeXBlcmxpbmtzIGFsc28gdG8gZGV0ZWN0CisJCSAqIHRoZSBub2RlcyBmb3IgKHBhcnRzIG9mKSB0eXBlIGFyZ3VtZW50cworCQkgKi8KKwkJaWYgKGJldy5nZXRPbmVPck1vcmVUeXBlQXJncygpID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpbnQgZXRhSW5kZXggPSAtMTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBiZXcuZ2V0T25lT3JNb3JlVHlwZUFyZ3MoKS5nZXRDaGlsZHJlbigpLmxlbmd0aDsgaSsrKSB7CisJCQlBU1ROb2RlIHRhTiA9IGJldy5nZXRPbmVPck1vcmVUeXBlQXJncygpLmdldENoaWxkcmVuKClbaV07CisJCQlpZiAodGFOIGluc3RhbmNlb2YgVHlwZUFyZykgeworCQkJCWV0YUluZGV4Kys7CisJCQkJRUdlbmVyaWNUeXBlIHRhRSA9IGd0LmdldEVUeXBlQXJndW1lbnRzKCkuZ2V0KGV0YUluZGV4KTsKKwkJCQlpZiAodGFOIGluc3RhbmNlb2YgV2lsZGNhcmQpIHsKKwkJCQkJV2lsZGNhcmQgdGFXTiA9IChXaWxkY2FyZCkgdGFOOworCQkJCQlCb3VuZEV4Y2VwdFdpbGRjYXJkIGJldzIgPSB0YVdOLmdldEJvdW5kRXhjZXB0V2lsZGNhcmQoKTsKKwkJCQkJaWYgKGJldzIgIT0gbnVsbCkgeworCQkJCQkJRUdlbmVyaWNUeXBlIHRhQiA9IG51bGw7CisJCQkJCQlpZiAodGFXTi5nZXRFeHRlbmRzT3JTdXBlcigpLmdldFRleHQoKS50cmltKCkudG9Mb3dlckNhc2UoKS5lcXVhbHMoImV4dGVuZHMiKSkgeworCQkJCQkJCXRhQiA9IHRhRS5nZXRFVXBwZXJCb3VuZCgpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0YUIgPSB0YUUuZ2V0RUxvd2VyQm91bmQoKTsKKwkJCQkJCX0KKwkJCQkJCXBsYWNlQmV3SW5CaWdNYXAoYmV3MiwgdGFCKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCUJvdW5kRXhjZXB0V2lsZGNhcmQgdGFCZXdOID0gKEJvdW5kRXhjZXB0V2lsZGNhcmQpIHRhTjsKKwkJCQkJcGxhY2VCZXdJbkJpZ01hcCh0YUJld04sIHRhRSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBFT2JqZWN0IGdldEVjb3JlRGVjbEZvclR5cGVSZWYoRUdlbmVyaWNUeXBlIGd0KSB7CisJCUVPYmplY3QgZWNvcmVEZWNsID0gbnVsbDsKKwkJaWYgKEdlbmVyaWNzVXRpbC5pc1JlZlRvQ2xhc3NpZmllcihndCkpIHsKKwkJCWVjb3JlRGVjbCA9IGd0LmdldEVDbGFzc2lmaWVyKCk7CisJCX0gZWxzZSB7CisJCQllY29yZURlY2wgPSBndC5nZXRFVHlwZVBhcmFtZXRlcigpOworCQl9CisJCXJldHVybiBlY29yZURlY2w7CisJfQorCisJcHJpdmF0ZSBBU1ROb2RlIGdldENzdERlY2xGb3JUeXBlUmVmKEVHZW5lcmljVHlwZSBndCkgeworCQlBU1ROb2RlIGNzdERlY2wgPSBudWxsOworCQlpZiAoR2VuZXJpY3NVdGlsLmlzUmVmVG9DbGFzc2lmaWVyKGd0KSkgeworCQkJRUNsYXNzaWZpZXIgYyA9IGd0LmdldEVDbGFzc2lmaWVyKCk7CisJCQljc3REZWNsID0gY3N0RGVjbDJFY29yZUFTVC5nZXRJbnYoYyk7CisJCX0gZWxzZSB7CisJCQlFVHlwZVBhcmFtZXRlciB0cCA9IGd0LmdldEVUeXBlUGFyYW1ldGVyKCk7CisJCQljc3REZWNsID0gY3N0RGVjbDJFY29yZUFTVC5nZXRJbnYodHApOworCQl9CisJCXJldHVybiBjc3REZWNsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyYXRvci9lY29yZS9FY29yZUdlbmVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyYXRvci9lY29yZS9FY29yZUdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MzU5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJhdG9yL2Vjb3JlL0Vjb3JlR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJhdG9yLmVjb3JlOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLnBhcnNlci5FbWZhdGljUGFyc2VyRHJpdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLnBhcnNlci5QYXJzZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUucGFyc2VyLlBhcnNlTWVzc2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS51dGlsLk1hcmtlclV0aWw7CisKKy8qKgorICogCisgKiBAYXV0aG9yIGNqZGFseUB1cy5pYm0uY29tCisgKi8KK3B1YmxpYyBjbGFzcyBFY29yZUdlbmVyYXRvciB7CisKKwlwdWJsaWMgRWNvcmVHZW5lcmF0b3IoKSB7CisJfQorCisJcHVibGljIHZvaWQgZ2VuZXJhdGUoSUZpbGUgZW1mRmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCWdlbmVyYXRlKGVtZkZpbGUsIHRydWUsIG1vbml0b3IpOworCX0KKworCXB1YmxpYyB2b2lkIGdlbmVyYXRlKElGaWxlIGVtZkZpbGUsIGJvb2xlYW4gd3JpdGVFY29yZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXRyeSB7CisJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGVtZkZpbGUuZ2V0Q29udGVudHMoKSkpOworCQkJRW1mYXRpY1BhcnNlckRyaXZlciBwYXJzZXIgPSBuZXcgRW1mYXRpY1BhcnNlckRyaXZlcigpOworCQkJUGFyc2VDb250ZXh0IHBhcnNlQ29udGV4dCA9IHBhcnNlci5wYXJzZShyZWFkZXIpOworCQkJU3RyaW5nIGZpbGVQYXRoID0gZ2V0RWNvcmVGaWxlUGF0aChlbWZGaWxlKTsKKwkJCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UoZmlsZVBhdGgpOworCQkJQnVpbGRlciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTsKKwkJCWJ1aWxkZXIuYnVpbGQocGFyc2VDb250ZXh0LCByZXNvdXJjZSwgbW9uaXRvcik7CisJCQlpZiAoIXBhcnNlQ29udGV4dC5oYXNFcnJvcnMoKSkgeworCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yKGJ1aWxkZXIpOworCQkJCWNvbm5lY3Rvci5jb25uZWN0KHBhcnNlQ29udGV4dCwgcmVzb3VyY2UsIG1vbml0b3IpOworCQkJfQorCQkJTWFya2VyVXRpbC51cGRhdGVNYXJrZXJzKGVtZkZpbGUsIHBhcnNlQ29udGV4dCk7CisKKwkJCWJvb2xlYW4gc2hvd1N0b3BwZXIgPSBmYWxzZTsKKwkJCS8qCisJCQkgKiB3ZSBsZXQgZWNvcmVzIHRvIGJlIHdyaXR0ZW4gYXMgbG9uZyBhcyB0aGV5IGNvbnRhaW4gb25seSBlcnJvcnMKKwkJCSAqIGRldGVjdGVkIGJ5IEVjb3JlVmFsaWRhdG9yRGlhZ25vc3RpYywgYXMgc3VjaCBlcnJvcnMgY2FuIGJlCisJCQkgKiBzb2x2ZWQgd2l0aCBTYW1wbGUgRWNvcmUgRWRpdG9yCisJCQkgKi8KKwkJCWZvciAoUGFyc2VNZXNzYWdlIHBtIDogcGFyc2VDb250ZXh0LmdldE1lc3NhZ2VzKCkpIHsKKwkJCQlzaG93U3RvcHBlciB8PSAhKHBtIGluc3RhbmNlb2YgRW1mYXRpY1NlbWFudGljV2FybmluZy5FY29yZVZhbGlkYXRvckRpYWdub3N0aWMpOworCQkJfQorCisJCQlpZiAoIXNob3dTdG9wcGVyICYmIHdyaXRlRWNvcmUpCisJCQkJcmVzb3VyY2Uuc2F2ZShudWxsKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIGdldEVjb3JlRmlsZVBhdGgoSUZpbGUgZW1mRmlsZSkgeworCQlTdHJpbmcgZW1mRmlsZUV4dCA9IGVtZkZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOworCQlpbnQgZXh0TGVuID0gZW1mRmlsZUV4dCAhPSBudWxsID8gZW1mRmlsZUV4dC5sZW5ndGgoKSArIDEgOiAwOworCQlTdHJpbmcgZW1mRmlsZU5hbWUgPSBlbWZGaWxlLmdldE5hbWUoKTsKKwkJU3RyaW5nIGZpbGVOYW1lID0gZW1mRmlsZU5hbWUuc3Vic3RyaW5nKDAsIGVtZkZpbGVOYW1lLmxlbmd0aCgpIC0gZXh0TGVuKTsKKwkJZmlsZU5hbWUgPSBmaWxlTmFtZSArICIuZWNvcmUiOworCQlTdHJpbmcgZmlsZVBhdGggPSBlbWZGaWxlLmdldEZ1bGxQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChmaWxlTmFtZSkudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGZpbGVQYXRoOworCX0KKworCXByaXZhdGUgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoU3RyaW5nIGZpbGVQYXRoKSB7CisJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZVBhdGgpOworCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7CisJCXJldHVybiByZXNvdXJjZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJhdG9yL2Vjb3JlL0VtZmF0aWNTZW1hbnRpY0Vycm9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJhdG9yL2Vjb3JlL0VtZmF0aWNTZW1hbnRpY0Vycm9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyY2E1NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmF0b3IvZWNvcmUvRW1mYXRpY1NlbWFudGljRXJyb3IuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJhdG9yLmVjb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW1mYXRpY1Rva2VuTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5JbXBvcnRTdG10OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlF1YWxpZmllZElEOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLnBhcnNlci5QYXJzZUVycm9yOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW1mYXRpY1NlbWFudGljRXJyb3IgZXh0ZW5kcyBQYXJzZUVycm9yCit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEdXBsaWNhdGVUeXBlVmFyaWFibGVOYW1lIGV4dGVuZHMgRW1mYXRpY1NlbWFudGljRXJyb3IgeworICAgIAlEdXBsaWNhdGVUeXBlVmFyaWFibGVOYW1lKEVtZmF0aWNUb2tlbk5vZGUgbmFtZVRva2VuTm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG5hbWVUZXh0ID0gVG9rZW5UZXh0LkdldChuYW1lVG9rZW5Ob2RlKTsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkR1cGxpY2F0ZSB0eXBlIHZhcmlhYmxlIG5hbWU6ICIgKyBuYW1lVGV4dDsKKyAgICAgICAgICAgIGludCByYW5nZVN0YXJ0ID0gbmFtZVRva2VuTm9kZS5nZXRSYW5nZVN0YXJ0KCk7CisgICAgICAgICAgICBpbnQgcmFuZ2VMZW5ndGggPSBuYW1lVG9rZW5Ob2RlLmdldFJhbmdlTGVuZ3RoKCk7CisgICAgICAgICAgICBpbml0KG1lc3NhZ2UsIHJhbmdlU3RhcnQsIHJhbmdlTGVuZ3RoKTsKKyAgICAgICAgfQorCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wb3J0Tm90Rm91bmQgZXh0ZW5kcyBFbWZhdGljU2VtYW50aWNFcnJvcgorICAgIHsKKworICAgICAgICBJbXBvcnROb3RGb3VuZChJbXBvcnRTdG10IGltcG9ydFN0bXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyByYXdRSURUZXh0ID0gVG9rZW5UZXh0LkdldChpbXBvcnRTdG10LmdldFVyaSgpKTsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkZhaWxlZCB0byBsb2FkIGltcG9ydCBtb2RlbDogIiArIHJhd1FJRFRleHQ7CisgICAgICAgICAgICBpbml0KG1lc3NhZ2UsIGltcG9ydFN0bXQuZ2V0UmFuZ2VTdGFydCgpLCBpbXBvcnRTdG10LmdldFJhbmdlTGVuZ3RoKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEdXBsaWNhdGVQYWNrYWdlTWVtYmVyRGVjbGFyYXRpb24gZXh0ZW5kcyBFbWZhdGljU2VtYW50aWNFcnJvcgorICAgIHsKKworICAgICAgICBEdXBsaWNhdGVQYWNrYWdlTWVtYmVyRGVjbGFyYXRpb24oRW1mYXRpY1Rva2VuTm9kZSBuYW1lVG9rZW5Ob2RlKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZVRleHQgPSBUb2tlblRleHQuR2V0KG5hbWVUb2tlbk5vZGUpOworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRHVwbGljYXRlIHBhY2thZ2UgbWVtYmVyIGRlY2xhcmF0aW9uOiAiICsgbmFtZVRleHQ7CisgICAgICAgICAgICBpbnQgcmFuZ2VTdGFydCA9IG5hbWVUb2tlbk5vZGUuZ2V0UmFuZ2VTdGFydCgpOworICAgICAgICAgICAgaW50IHJhbmdlTGVuZ3RoID0gbmFtZVRva2VuTm9kZS5nZXRSYW5nZUxlbmd0aCgpOworICAgICAgICAgICAgaW5pdChtZXNzYWdlLCByYW5nZVN0YXJ0LCByYW5nZUxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIER1cGxpY2F0ZUNsYXNzU3RydWN0dXJhbEZlYXR1cmVEZWNsYXJhdGlvbiBleHRlbmRzIEVtZmF0aWNTZW1hbnRpY0Vycm9yCisgICAgeworCisgICAgICAgIER1cGxpY2F0ZUNsYXNzU3RydWN0dXJhbEZlYXR1cmVEZWNsYXJhdGlvbihFbWZhdGljVG9rZW5Ob2RlIG5hbWVUb2tlbk5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lVGV4dCA9IFRva2VuVGV4dC5HZXQobmFtZVRva2VuTm9kZSk7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJEdXBsaWNhdGUgY2xhc3Mgc3RydWN0dXJhbCBmZWF0dXJlIGRlY2xhcmF0aW9uOiAiICsgbmFtZVRleHQ7CisgICAgICAgICAgICBpbnQgcmFuZ2VTdGFydCA9IG5hbWVUb2tlbk5vZGUuZ2V0UmFuZ2VTdGFydCgpOworICAgICAgICAgICAgaW50IHJhbmdlTGVuZ3RoID0gbmFtZVRva2VuTm9kZS5nZXRSYW5nZUxlbmd0aCgpOworICAgICAgICAgICAgaW5pdChtZXNzYWdlLCByYW5nZVN0YXJ0LCByYW5nZUxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVSZXNvbHV0aW9uRmFpbHVyZSBleHRlbmRzIEVtZmF0aWNTZW1hbnRpY0Vycm9yCisgICAgeworCisgICAgICAgIE5hbWVSZXNvbHV0aW9uRmFpbHVyZShRdWFsaWZpZWRJRCBxdWFsaWZpZWRJRCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHJhd1FJRFRleHQgPSBUb2tlblRleHQuR2V0KHF1YWxpZmllZElEKTsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkZhaWxlZCB0byByZXNvbHZlIHR5cGU6ICIgKyByYXdRSURUZXh0OworICAgICAgICAgICAgaW5pdChtZXNzYWdlLCBxdWFsaWZpZWRJRC5nZXRSYW5nZVN0YXJ0KCksIHF1YWxpZmllZElELmdldFJhbmdlTGVuZ3RoKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbGxlZ2FsU3VwZXJDbGFzc0tpbmQgZXh0ZW5kcyBFbWZhdGljU2VtYW50aWNFcnJvcgorICAgIHsKKworICAgICAgICBJbGxlZ2FsU3VwZXJDbGFzc0tpbmQoUXVhbGlmaWVkSUQgcXVhbGlmaWVkSUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlN1cGVyY2xhc3MgbXVzdCBiZSBhbiBFQ2xhc3MhIjsKKyAgICAgICAgICAgIGluaXQobWVzc2FnZSwgcXVhbGlmaWVkSUQuZ2V0UmFuZ2VTdGFydCgpLCBxdWFsaWZpZWRJRC5nZXRSYW5nZUxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSWxsZWdhbEF0dHJpYnV0ZUtpbmQgZXh0ZW5kcyBFbWZhdGljU2VtYW50aWNFcnJvcgorICAgIHsKKworICAgICAgICBJbGxlZ2FsQXR0cmlidXRlS2luZChRdWFsaWZpZWRJRCBxdWFsaWZpZWRJRCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQXR0cmlidXRlIHR5cGUgbXVzdCBiZSBhbiBFRGF0YVR5cGUhIjsKKyAgICAgICAgICAgIGluaXQobWVzc2FnZSwgcXVhbGlmaWVkSUQuZ2V0UmFuZ2VTdGFydCgpLCBxdWFsaWZpZWRJRC5nZXRSYW5nZUxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSWxsZWdhbFJlZmVyZW5jZUtpbmQgZXh0ZW5kcyBFbWZhdGljU2VtYW50aWNFcnJvcgorICAgIHsKKworICAgICAgICBJbGxlZ2FsUmVmZXJlbmNlS2luZChRdWFsaWZpZWRJRCBxdWFsaWZpZWRJRCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiUmVmZXJlbmNlIHR5cGUgbXVzdCBiZSBhbiBFQ2xhc3MhIjsKKyAgICAgICAgICAgIGluaXQobWVzc2FnZSwgcXVhbGlmaWVkSUQuZ2V0UmFuZ2VTdGFydCgpLCBxdWFsaWZpZWRJRC5nZXRSYW5nZUxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBFbWZhdGljU2VtYW50aWNFcnJvcigpCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmF0b3IvZWNvcmUvRW1mYXRpY1NlbWFudGljV2FybmluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyYXRvci9lY29yZS9FbWZhdGljU2VtYW50aWNXYXJuaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2NmI5NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmF0b3IvZWNvcmUvRW1mYXRpY1NlbWFudGljV2FybmluZy5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LktleUVxdWFsc1ZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLnBhcnNlci5QYXJzZVdhcm5pbmc7CisKKworLyoqCisgKiAKKyAqIEBhdXRob3IgY2pkYWx5QHVzLmlibS5jb20KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEVtZmF0aWNTZW1hbnRpY1dhcm5pbmcgZXh0ZW5kcyBQYXJzZVdhcm5pbmcgeworCXB1YmxpYyBzdGF0aWMgY2xhc3MgVW5rbm93bkVQYWNrYWdlTmFtZXNwYWNlQXR0cmlidXRlS2V5IGV4dGVuZHMgRW1mYXRpY1NlbWFudGljV2FybmluZyB7CisKKwkJVW5rbm93bkVQYWNrYWdlTmFtZXNwYWNlQXR0cmlidXRlS2V5KEtleUVxdWFsc1ZhbHVlIGtleUVxdWFsc1ZhbHVlKSB7CisJCQlTdHJpbmcga2V5ID0gVG9rZW5UZXh0LkdldChrZXlFcXVhbHNWYWx1ZS5nZXRLZXkoKSk7CisJCQlTdHJpbmcgbWVzc2FnZSA9ICJJZ25vcmluZyB1bmtub3duIEVQYWNrYWdlIG5hbWVzcGFjZSBhbm5vdGF0aW9uIGtleTogIiArIGtleQorCQkJCQkrICIuIChVc2UgXCJ1cmlcIiBvciBcInByZWZpeFwiIGZvciBrZXlzIGhlcmUuKSI7CisJCQlpbml0KG1lc3NhZ2UsIGtleUVxdWFsc1ZhbHVlLmdldFJhbmdlU3RhcnQoKSwga2V5RXF1YWxzVmFsdWUuZ2V0UmFuZ2VMZW5ndGgoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFVua25vd25BdHRyaWJ1dGVJbXBsaWNpdEtleSBleHRlbmRzIEVtZmF0aWNTZW1hbnRpY1dhcm5pbmcgeworCisJCVVua25vd25BdHRyaWJ1dGVJbXBsaWNpdEtleShLZXlFcXVhbHNWYWx1ZSBrZXlFcXVhbHNWYWx1ZSwgU3RyaW5nIGdlbmVyYXRlZEtleSkgeworCQkJU3RyaW5nIG1lc3NhZ2UgPSAiQW5ub3RhdGlvbiB3aXRoIHVuZGVmaW5lZCBpbXBsaWNpdCBrZXkgbmFtZS4gIFVzaW5nIGtleTogIiArIGdlbmVyYXRlZEtleQorCQkJCQkrICIuIChTZWUgZG9jdW1lbnRhdGlvbiBmb3IgdXNlIG9mICIgKyAiRW1mYXRpY0Fubm90YXRpb25NYXAiICsgIiBhbm5vdGF0aW9uKSI7CisJCQlpbml0KG1lc3NhZ2UsIGtleUVxdWFsc1ZhbHVlLmdldFJhbmdlU3RhcnQoKSwga2V5RXF1YWxzVmFsdWUuZ2V0UmFuZ2VMZW5ndGgoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEFubm90YXRpb25NYXBwaW5nUHJvYmxlbSBleHRlbmRzIEVtZmF0aWNTZW1hbnRpY1dhcm5pbmcgeworCisJCXB1YmxpYyBBbm5vdGF0aW9uTWFwcGluZ1Byb2JsZW0oS2V5RXF1YWxzVmFsdWUga2V5RXF1YWxzVmFsdWUsIFN0cmluZyBtZXNzYWdlKSB7CisJCQlpbml0KG1lc3NhZ2UsIGtleUVxdWFsc1ZhbHVlLmdldFJhbmdlU3RhcnQoKSwga2V5RXF1YWxzVmFsdWUuZ2V0UmFuZ2VMZW5ndGgoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEVjb3JlVmFsaWRhdG9yRGlhZ25vc3RpYyBleHRlbmRzIEVtZmF0aWNTZW1hbnRpY1dhcm5pbmcgeworCisJCXB1YmxpYyBFY29yZVZhbGlkYXRvckRpYWdub3N0aWMoQVNUTm9kZSBub2RlLCBTdHJpbmcgbWVzc2FnZSkgeworCQkJaW5pdChtZXNzYWdlLCBub2RlLmdldFJhbmdlU3RhcnQoKSwgbm9kZS5nZXRSYW5nZUxlbmd0aCgpKTsKKwkJfQorCisJCXB1YmxpYyBFY29yZVZhbGlkYXRvckRpYWdub3N0aWMoU3RyaW5nIG1lc3NhZ2UsIGludCByYW5nZVN0YXJ0LCBpbnQgcmFuZ2VMZW5ndGgpIHsKKwkJCWluaXQobWVzc2FnZSwgcmFuZ2VTdGFydCwgcmFuZ2VMZW5ndGgpOworCQl9CisJfQorCisJcHVibGljIEVtZmF0aWNTZW1hbnRpY1dhcm5pbmcoKSB7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyYXRvci9lY29yZS9HZW5lcmF0aW9uUGhhc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmF0b3IvZWNvcmUvR2VuZXJhdGlvblBoYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxNWI2NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmF0b3IvZWNvcmUvR2VuZXJhdGlvblBoYXNlLmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkJvb2xFeHByOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkJvdW5kRXhjZXB0V2lsZGNhcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQ2hhckV4cHI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRGVmYXVsdFZhbHVlRXhwcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5FbWZhdGljVG9rZW5Ob2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkludEV4cHI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuTXVsdGlwbGljaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0Lk11bHRpcGxpY2l0eUV4cHI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuUXVhbGlmaWVkSUQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuUXVhbGlmaWVkSURDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuU3RyaW5nRXhwcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5TdHJpbmdMaXRlcmFsQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlR5cGVBcmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuV2lsZGNhcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS51dGlsLkVtZmF0aWNLZXl3b3JkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5wYXJzZXIuUGFyc2VDb250ZXh0OworCisvKioKKyAqIAorICogQGF1dGhvciBjamRhbHlAdXMuaWJtLmNvbQorICogQGF1dGhvciBtaWd1ZWwuZ2FyY2lhQHR1aGguZGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYXRpb25QaGFzZSB7CisKKwlwdWJsaWMgR2VuZXJhdGlvblBoYXNlKCkgeworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRQYXJzZUNvbnRleHQoUGFyc2VDb250ZXh0IHBhcnNlQ29udGV4dCkgeworCQlfcGFyc2VDb250ZXh0ID0gcGFyc2VDb250ZXh0OworCX0KKworCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKEVtZmF0aWNTZW1hbnRpY0Vycm9yIGVycm9yKSB7CisJCV9wYXJzZUNvbnRleHQuYWRkUGFyc2VNZXNzYWdlKGVycm9yKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKEVtZmF0aWNTZW1hbnRpY1dhcm5pbmcgd2FybmluZykgeworCQlfcGFyc2VDb250ZXh0LmFkZFBhcnNlTWVzc2FnZSh3YXJuaW5nKTsKKwl9CisKKwlwcm90ZWN0ZWQgRVBhY2thZ2UgZ2V0U3ViUGFja2FnZShFUGFja2FnZSBlUGFja2FnZSwgU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChJdGVyYXRvcjxFUGFja2FnZT4gaXAgPSBlUGFja2FnZS5nZXRFU3VicGFja2FnZXMoKS5pdGVyYXRvcigpOyBpcC5oYXNOZXh0KCk7KSB7CisJCQlFUGFja2FnZSBzdWJQYWNrYWdlID0gaXAubmV4dCgpOworCQkJaWYgKG5hbWUuZXF1YWxzKHN1YlBhY2thZ2UuZ2V0TmFtZSgpKSkKKwkJCQlyZXR1cm4gc3ViUGFja2FnZTsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBFT3BlcmF0aW9uIGdldE9wZXJhdGlvbihFQ2xhc3MgZUNsYXNzLCBTdHJpbmcgbmFtZSkgeworCQlmb3IgKEl0ZXJhdG9yPEVPcGVyYXRpb24+IGlvcCA9IGVDbGFzcy5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGlvcC5oYXNOZXh0KCk7KSB7CisJCQlFT3BlcmF0aW9uIGVPcCA9IGlvcC5uZXh0KCk7CisJCQlpZiAobmFtZS5lcXVhbHMoZU9wLmdldE5hbWUoKSkpCisJCQkJcmV0dXJuIGVPcDsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBFUGFyYW1ldGVyIGdldFBhcmFtKEVPcGVyYXRpb24gZU9wLCBTdHJpbmcgbmFtZSkgeworCQlmb3IgKEl0ZXJhdG9yPEVQYXJhbWV0ZXI+IGlwID0gZU9wLmdldEVQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKTsgaXAuaGFzTmV4dCgpOykgeworCQkJRVBhcmFtZXRlciBwYXJhbSA9IGlwLm5leHQoKTsKKwkJCWlmIChuYW1lLmVxdWFscyhwYXJhbS5nZXROYW1lKCkpKQorCQkJCXJldHVybiBwYXJhbTsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgc3RyaXBRdW90ZXMoU3RyaW5nIHF1b3RlZFN0cmluZykgeworCQlyZXR1cm4gcXVvdGVkU3RyaW5nLnN1YnN0cmluZygxLCBxdW90ZWRTdHJpbmcubGVuZ3RoKCkgLSAxKTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIGxpdGVyYWwpIHsKKwkJU3RyaW5nIHZhbHVlID0gbnVsbDsKKwkJaWYgKGxpdGVyYWwgaW5zdGFuY2VvZiBRdWFsaWZpZWRJRENvbnRhaW5lcikgeworCQkJUXVhbGlmaWVkSURDb250YWluZXIgcWlkQ29udGFpZXIgPSAoUXVhbGlmaWVkSURDb250YWluZXIpIGxpdGVyYWw7CisJCQl2YWx1ZSA9IGdldElEVGV4dChxaWRDb250YWllci5nZXRRdWFsaWZpZWRJRCgpKTsKKwkJfSBlbHNlIGlmIChsaXRlcmFsIGluc3RhbmNlb2YgU3RyaW5nTGl0ZXJhbENvbnRhaW5lcikKKwkJCXZhbHVlID0gc3RyaXBRdW90ZXMoVG9rZW5UZXh0LkdldChsaXRlcmFsKSk7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKERlZmF1bHRWYWx1ZUV4cHIgZGVmYXVsdFZhbHVlRXhwcikgeworCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCQlpZiAoZGVmYXVsdFZhbHVlRXhwciBpbnN0YW5jZW9mIEJvb2xFeHByKQorCQkJdmFsdWUgPSBUb2tlblRleHQuR2V0KGRlZmF1bHRWYWx1ZUV4cHIpOworCQllbHNlIGlmIChkZWZhdWx0VmFsdWVFeHByIGluc3RhbmNlb2YgSW50RXhwcikKKwkJCXZhbHVlID0gVG9rZW5UZXh0LkdldChkZWZhdWx0VmFsdWVFeHByKTsKKwkJZWxzZSBpZiAoZGVmYXVsdFZhbHVlRXhwciBpbnN0YW5jZW9mIFN0cmluZ0V4cHIpCisJCQl2YWx1ZSA9IHN0cmlwUXVvdGVzKFRva2VuVGV4dC5HZXQoZGVmYXVsdFZhbHVlRXhwcikpOworCQllbHNlIGlmIChkZWZhdWx0VmFsdWVFeHByIGluc3RhbmNlb2YgQ2hhckV4cHIpCisJCQl2YWx1ZSA9IHN0cmlwUXVvdGVzKFRva2VuVGV4dC5HZXQoZGVmYXVsdFZhbHVlRXhwcikpOworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZShCb3VuZEV4Y2VwdFdpbGRjYXJkIG5vbldpbGRCb3VuZCkgeworCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCQlpZiAobm9uV2lsZEJvdW5kLmdldE9uZU9yTW9yZVR5cGVBcmdzKCkgIT0gbnVsbCkgeworCQkJdmFsdWUgPSBnZXRJRFRleHQobm9uV2lsZEJvdW5kLmdldFJhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lKCkpOworCQkJdmFsdWUgKz0gIjwiOworCQkJQVNUTm9kZVtdIHRhcyA9IG5vbldpbGRCb3VuZC5nZXRPbmVPck1vcmVUeXBlQXJncygpLmdldENoaWxkcmVuKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcy5sZW5ndGg7IGkrKykgeworCQkJCWlmICh0YXNbaV0gaW5zdGFuY2VvZiBUeXBlQXJnKSB7CisJCQkJCVR5cGVBcmcgdGEgPSAoVHlwZUFyZykgdGFzW2ldOworCQkJCQl2YWx1ZSArPSBnZXRWYWx1ZSh0YSkgKyAoaSA8IHRhcy5sZW5ndGggPyAiLCAiIDogIiIpOworCQkJCX0KKwkJCX0KKwkJCXZhbHVlICs9ICI+IjsKKwkJfSBlbHNlIHsKKwkJCS8vIG11c3QgYmUgYSBSYXdUeXBlT3JUeXBlVmFyCisJCQl2YWx1ZSA9IHVuZXNjYXBlKFRva2VuVGV4dC5HZXQobm9uV2lsZEJvdW5kKSk7CisJCX0KKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoVHlwZUFyZyB0YSkgeworCQlTdHJpbmcgdmFsdWUgPSAiIjsKKwkJaWYgKHRhIGluc3RhbmNlb2YgQm91bmRFeGNlcHRXaWxkY2FyZCkgeworCQkJdmFsdWUgPSBnZXRWYWx1ZSgoQm91bmRFeGNlcHRXaWxkY2FyZCkgdGEpOworCQl9IGVsc2UgeworCQkJLy8gbXVzdCBiZSBhIHdpbGRjYXJkCisJCQkvLyBzZXF1ZW5jZSB3aWxkY2FyZCA6IFFNQVJLICggZXh0ZW5kc09yU3VwZXIgYm91bmRFeGNlcHRXaWxkY2FyZCApPworCQkJdmFsdWUgPSAiPyI7CisJCQlXaWxkY2FyZCB3ID0gKFdpbGRjYXJkKSB0YTsgCisJCQlCb3VuZEV4Y2VwdFdpbGRjYXJkIG5vbldpbGRCb3VuZCA9IHcuZ2V0Qm91bmRFeGNlcHRXaWxkY2FyZCgpOworCQkJaWYgKG5vbldpbGRCb3VuZCAhPSBudWxsICkgeworCQkJCXZhbHVlICs9ICIgIiArIGdldFZhbHVlKG5vbldpbGRCb3VuZCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElEVGV4dChFbWZhdGljVG9rZW5Ob2RlIGlkVG9rZW4pIHsKKwkJcmV0dXJuIHVuZXNjYXBlKGlkVG9rZW4uZ2V0VGV4dCgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJRFRleHQoUXVhbGlmaWVkSUQgcXVhbGlmaWVkSUQpIHsKKwkJcmV0dXJuIHVuZXNjYXBlKFRva2VuVGV4dC5HZXQocXVhbGlmaWVkSUQpKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB1bmVzY2FwZShTdHJpbmcgaWQpIHsKKwkJcmV0dXJuIGlkLnJlcGxhY2VBbGwoRW1mYXRpY0tleXdvcmRzLktFWVdPUkRfRVNDQVBFX1NUUklORywgIiIpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldE11bHRpcGxpY2l0eShNdWx0aXBsaWNpdHkgbXVsdGlwbGljaXR5LCBFVHlwZWRFbGVtZW50IGVUeXBlZEVsZW1lbnQpIHsKKwkJaWYgKG11bHRpcGxpY2l0eSA9PSBudWxsKSB7CisJCQllVHlwZWRFbGVtZW50LnNldExvd2VyQm91bmQoMCk7CisJCQllVHlwZWRFbGVtZW50LnNldFVwcGVyQm91bmQoMSk7CisJCQlyZXR1cm47CisJCX0KKwkJTXVsdGlwbGljaXR5RXhwciBtRXhwciA9IG11bHRpcGxpY2l0eS5nZXRNdWx0aXBsaWNpdHlFeHByKCk7CisJCWlmIChtRXhwciA9PSBudWxsKSB7CisJCQllVHlwZWRFbGVtZW50LnNldExvd2VyQm91bmQoMCk7CisJCQllVHlwZWRFbGVtZW50LnNldFVwcGVyQm91bmQoLTEpOworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBsb3dlckJvdW5kVGV4dCA9IG1FeHByLmdldExvd2VyQm91bmQoKS5nZXRUZXh0KCk7CisJCWlmIChsb3dlckJvdW5kVGV4dC5lcXVhbHMoIj8iKSkgeworCQkJZVR5cGVkRWxlbWVudC5zZXRMb3dlckJvdW5kKDApOworCQkJZVR5cGVkRWxlbWVudC5zZXRVcHBlckJvdW5kKDEpOworCQl9IGVsc2UgaWYgKGxvd2VyQm91bmRUZXh0LmVxdWFscygiKiIpKSB7CisJCQllVHlwZWRFbGVtZW50LnNldExvd2VyQm91bmQoMCk7CisJCQllVHlwZWRFbGVtZW50LnNldFVwcGVyQm91bmQoLTEpOworCQl9IGVsc2UgaWYgKGxvd2VyQm91bmRUZXh0LmVxdWFscygiKyIpKSB7CisJCQllVHlwZWRFbGVtZW50LnNldExvd2VyQm91bmQoMSk7CisJCQllVHlwZWRFbGVtZW50LnNldFVwcGVyQm91bmQoLTEpOworCQl9IGVsc2UgeworCQkJaW50IGxvd2VyQm91bmQgPSBJbnRlZ2VyLnBhcnNlSW50KGxvd2VyQm91bmRUZXh0KTsKKwkJCWVUeXBlZEVsZW1lbnQuc2V0TG93ZXJCb3VuZChsb3dlckJvdW5kKTsKKwkJCWlmIChtRXhwci5nZXRVcHBlckJvdW5kKCkgPT0gbnVsbCkgeworCQkJCWVUeXBlZEVsZW1lbnQuc2V0VXBwZXJCb3VuZChsb3dlckJvdW5kKTsKKwkJCX0gZWxzZSB7CisJCQkJU3RyaW5nIHVwcGVyQm91bmRUZXh0ID0gbUV4cHIuZ2V0VXBwZXJCb3VuZCgpLmdldFRleHQoKTsKKwkJCQlpZiAodXBwZXJCb3VuZFRleHQuZXF1YWxzKCI/IikpCisJCQkJCWVUeXBlZEVsZW1lbnQuc2V0VXBwZXJCb3VuZCgtMik7CisJCQkJZWxzZSBpZiAodXBwZXJCb3VuZFRleHQuZXF1YWxzKCIqIikpCisJCQkJCWVUeXBlZEVsZW1lbnQuc2V0VXBwZXJCb3VuZCgtMSk7CisJCQkJZWxzZSBpZiAodXBwZXJCb3VuZFRleHQuZXF1YWxzKCIrIikpIHsKKwkJCQkJZVR5cGVkRWxlbWVudC5zZXRVcHBlckJvdW5kKC0xKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgdXBwZXJCb3VuZCA9IEludGVnZXIucGFyc2VJbnQodXBwZXJCb3VuZFRleHQpOworCQkJCQllVHlwZWRFbGVtZW50LnNldFVwcGVyQm91bmQodXBwZXJCb3VuZCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBQYXJzZUNvbnRleHQgX3BhcnNlQ29udGV4dDsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmF0b3IvZWNvcmUvVG9rZW5UZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJhdG9yL2Vjb3JlL1Rva2VuVGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMjFmOTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJhdG9yL2Vjb3JlL1Rva2VuVGV4dC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkVtZmF0aWNBU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkVtZmF0aWNBU1ROb2RlVmlzaXRvcjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgY2pkYWx5QHVzLmlibS5jb20KKyAqLworcHVibGljIGNsYXNzIFRva2VuVGV4dCBleHRlbmRzIEVtZmF0aWNBU1ROb2RlVmlzaXRvciB7CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgX2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEdldChFbWZhdGljQVNUTm9kZSBub2RlKSB7CisgICAgICAgIFRva2VuVGV4dCB0dCA9IG5ldyBUb2tlblRleHQoKTsKKyAgICAgICAgdHQudmlzaXQobm9kZSk7CisgICAgICAgIHJldHVybiB0dC5fYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoRW1mYXRpY0FTVE5vZGUgbm9kZSkgeworICAgICAgICBTdHJpbmcgdGV4dCA9IG5vZGUuZ2V0VGV4dCgpOworICAgICAgICBpZiAodGV4dCAhPSBudWxsKSBfYnVmLmFwcGVuZCh0ZXh0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyYXRvci9lY29yZS9Ub2tlblRleHRCbGFua1NlcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyYXRvci9lY29yZS9Ub2tlblRleHRCbGFua1NlcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMWVmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJhdG9yL2Vjb3JlL1Rva2VuVGV4dEJsYW5rU2VwLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmF0b3IuZWNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5FbWZhdGljQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5FbWZhdGljQVNUTm9kZVZpc2l0b3I7CisKKworcHVibGljIGNsYXNzIFRva2VuVGV4dEJsYW5rU2VwIGV4dGVuZHMgRW1mYXRpY0FTVE5vZGVWaXNpdG9yCit7CisKKyAgICBwdWJsaWMgVG9rZW5UZXh0QmxhbmtTZXAoKQorICAgIHsKKyAgICAgICAgX2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBHZXQoRW1mYXRpY0FTVE5vZGUgbm9kZSkKKyAgICB7CisgICAgICAgIFRva2VuVGV4dEJsYW5rU2VwIHR0ID0gbmV3IFRva2VuVGV4dEJsYW5rU2VwKCk7CisgICAgICAgIHR0LnZpc2l0KG5vZGUpOworICAgICAgICByZXR1cm4gdHQuX2J1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoRW1mYXRpY0FTVE5vZGUgbm9kZSkKKyAgICB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gbm9kZS5nZXRUZXh0KCk7CisgICAgICAgIGlmKHRleHQgIT0gbnVsbCkgeworICAgICAgICAJU3RyaW5nIHNlcFByZSA9ICIiOworICAgICAgICAJU3RyaW5nIHNlcFBvc3QgPSAiIjsgCisgICAgICAgIAlTdHJpbmcgcHJldlRleHQgPSBfYnVmLnRvU3RyaW5nKCkgKyAgdGV4dDsgCisgICAgICAgIAlpZiAocHJldlRleHQuZW5kc1dpdGgoImV4dGVuZHMiKQorICAgICAgICAJCQl8fCBwcmV2VGV4dC5lbmRzV2l0aCgic3VwZXIiKSkgeworCQkJCXNlcFBvc3QgPSAiICI7CisJCQl9IAorICAgICAgICAJaWYgKHRleHQuZXF1YWxzKCJleHRlbmRzIikgfHwgdGV4dC5lcXVhbHMoInN1cGVyIikgKSB7CisgICAgICAgIAkJc2VwUHJlID0gIiAiOworCQkJfQorICAgICAgICAgICAgX2J1Zi5hcHBlbmQoc2VwUHJlICsgdGV4dCArIHNlcFBvc3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIF9idWY7CisgICAgCisgICAKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmF0b3IvZW1mYXRpYy9FbWZhdGljR2VuZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJhdG9yL2VtZmF0aWMvRW1mYXRpY0dlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZmRlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJhdG9yL2VtZmF0aWMvRW1mYXRpY0dlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lbWZhdGljOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgY2pkYWx5QHVzLmlibS5jb20KKyAqLworcHVibGljIGNsYXNzIEVtZmF0aWNHZW5lcmF0b3IgeworCQorICAgIHB1YmxpYyBFbWZhdGljR2VuZXJhdG9yKCkKKyAgICB7CisgICAgICAgIF9yZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZShJRmlsZSBlY29yZUZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgZWNvcmVGaWxlUGF0aCA9IGVjb3JlRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBSZXNvdXJjZSBlY29yZVJlc291cmNlID0gZ2V0UmVzb3VyY2UoX3Jlc291cmNlU2V0LCBlY29yZUZpbGVQYXRoKTsKKyAgICAgICAgICAgIFN0cmluZyBlbWZhdGljRmlsZVBhdGggPSBnZXRFbWZhdGljRmlsZVBhdGgoZWNvcmVGaWxlKTsKKyAgICAgICAgICAgIFdyaXRlciB3cml0ZXIgPSBuZXcgV3JpdGVyKCk7CisgICAgICAgICAgICBTdHJpbmcgZW1mYXRpY1RleHQgPSB3cml0ZXIud3JpdGUoZWNvcmVSZXNvdXJjZSwgbW9uaXRvciwgZWNvcmVGaWxlKTsKKyAgICAgICAgICAgIHdyaXRlRW1mYXRpY0ZpbGUoZW1mYXRpY0ZpbGVQYXRoLCBlbWZhdGljVGV4dC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZSBnZXRSZXNvdXJjZShSZXNvdXJjZVNldCByZXNvdXJjZVNldCwgU3RyaW5nIGZpbGVQYXRoKQorICAgIHsKKyAgICAgICAgVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGVQYXRoKTsKKyAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOworICAgICAgICByZXR1cm4gcmVzb3VyY2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlRW1mYXRpY0ZpbGUoU3RyaW5nIGVtZmF0aWNGaWxlUGF0aCwgU3RyaW5nIGZpbGVUZXh0KQorICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChlbWZhdGljRmlsZVBhdGgpOworICAgICAgICBJRmlsZSBlbWZhdGljRmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZShwYXRoKTsKKyAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShmaWxlVGV4dC5nZXRCeXRlcygpKTsKKyAgICAgICAgaWYoZW1mYXRpY0ZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICBlbWZhdGljRmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgZmFsc2UsIG51bGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlbWZhdGljRmlsZS5jcmVhdGUoaW4sIHRydWUsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEVtZmF0aWNGaWxlUGF0aChJRmlsZSBlY29yZUZpbGUpCisgICAgeworICAgICAgICBTdHJpbmcgZWNvcmVGaWxlRXh0ID0gZWNvcmVGaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKKyAgICAgICAgaW50IGV4dExlbiA9IGVjb3JlRmlsZUV4dCAhPSBudWxsID8gZWNvcmVGaWxlRXh0Lmxlbmd0aCgpICsgMSA6IDA7CisgICAgICAgIFN0cmluZyBlY29yZUZpbGVOYW1lID0gZWNvcmVGaWxlLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZWNvcmVGaWxlTmFtZS5zdWJzdHJpbmcoMCwgZWNvcmVGaWxlTmFtZS5sZW5ndGgoKSAtIGV4dExlbik7CisgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUgKyAiLmVtZiI7CisgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IGVjb3JlRmlsZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQoZmlsZU5hbWUpLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBmaWxlUGF0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlU2V0IF9yZXNvdXJjZVNldDsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmF0b3IvZW1mYXRpYy9Xcml0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmF0b3IvZW1mYXRpYy9Xcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTVjNWYxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyYXRvci9lbWZhdGljL1dyaXRlci5qYXZhCkBAIC0wLDAgKzEsODIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJhdG9yLmVtZmF0aWM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FR2VuZXJpY1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJpY3MudXRpbC5HZW5lcmljc1V0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS51dGlsLkVtZmF0aWNBbm5vdGF0aW9uTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUudXRpbC5FbWZhdGljQmFzaWNUeXBlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLnV0aWwuRW1mYXRpY0tleXdvcmRzOworCitwdWJsaWMgY2xhc3MgV3JpdGVyIHsKKworCXB1YmxpYyBXcml0ZXIoKSB7CisJfQorCisJcHVibGljIFN0cmluZyB3cml0ZShSZXNvdXJjZSBlY29yZVJlc291cmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCisJCQlJRmlsZSBlY29yZUZpbGUpIHsKKwkJX2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworCQlpZiAoZWNvcmVSZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKSA+IDEpIHsKKwkJCWZpbmFsIEVQYWNrYWdlIHRvcCA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRVBhY2thZ2UoKTsKKwkJCXRvcC5zZXROYW1lKCJ0b3AiKTsKKwkJCXRvcC5zZXROc1ByZWZpeCgidG9wIik7CisJCQl0b3Auc2V0TnNVUkkoInRvcCIpOworCQkJZm9yIChFT2JqZWN0IG9sZFRvcCA6IGVjb3JlUmVzb3VyY2UuZ2V0Q29udGVudHMoKSkgeworCQkJCWlmIChvbGRUb3AgaW5zdGFuY2VvZiBFUGFja2FnZSkgeworCQkJCQl0b3AuZ2V0RVN1YnBhY2thZ2VzKCkuYWRkKChFUGFja2FnZSkgb2xkVG9wKTsKKwkJCQl9CisJCQl9CisJCQllY29yZVJlc291cmNlLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKKwkJCWVjb3JlUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQodG9wKTsKKwkJfQorCisJCUVQYWNrYWdlIG1haW5QYWNrYWdlID0gKEVQYWNrYWdlKSBlY29yZVJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOworCisJCV9wcm9jZXNzaW5nRWNvcmUgPSBpbml0UHJvY2Vzc2luZ0Vjb3JlKG1haW5QYWNrYWdlKTsKKwkJX2Fubm90YXRpb25NYXAgPSBuZXcgRW1mYXRpY0Fubm90YXRpb25NYXAoKTsKKwkJd3JpdGVNYWluUGFja2FnZShtYWluUGFja2FnZSk7CisJCXJldHVybiBfYnVmLnRvU3RyaW5nKCk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGluaXRQcm9jZXNzaW5nRWNvcmUoRVBhY2thZ2UgbWFpblBhY2thZ2UpIHsKKwkJRVBhY2thZ2UgZWNvcmUgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFOworCQlpZiAoIWVjb3JlLmdldE5hbWUoKS5lcXVhbHMobWFpblBhY2thZ2UuZ2V0TmFtZSgpKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKCFlY29yZS5nZXROc1ByZWZpeCgpLmVxdWFscyhtYWluUGFja2FnZS5nZXROc1ByZWZpeCgpKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIGVjb3JlLmdldE5zVVJJKCkuZXF1YWxzKG1haW5QYWNrYWdlLmdldE5zVVJJKCkpOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZU1haW5QYWNrYWdlKEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJCVN0cmluZyBuYW1lID0gZXNjYXBlKGVQYWNrYWdlLmdldE5hbWUoKSk7CisJCXdyaXRlQW5ub3RhdGlvbnMoZVBhY2thZ2UsIDAsIGZhbHNlKTsKKwkJd3JpdGVOYW1lc3BhY2VJbmZvKGVQYWNrYWdlLCAwKTsKKwkJd3JpdGVsbigicGFja2FnZSAiICsgbmFtZSArICI7Iik7CisJCXdyaXRlbG4oKTsKKwkJd3JpdGVJbXBvcnRzKGVQYWNrYWdlKTsKKwkJd3JpdGVQYWNrYWdlQ29udGVudHMoZVBhY2thZ2UsIDApOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUltcG9ydHMoRVBhY2thZ2UgZVBhY2thZ2UpIHsKKwkJaWYgKF9wcm9jZXNzaW5nRWNvcmUpCisJCQlyZXR1cm47CisJCUhhc2h0YWJsZSByZXNvdXJjZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOworCQlmb3IgKFRyZWVJdGVyYXRvciB0aSA9IGVQYWNrYWdlLmVBbGxDb250ZW50cygpOyB0aS5oYXNOZXh0KCk7KSB7CisJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgdGkubmV4dCgpOworCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBFVHlwZWRFbGVtZW50KSB7CisJCQkJRVR5cGVkRWxlbWVudCBlVHlwZWRFbGVtZW50ID0gKEVUeXBlZEVsZW1lbnQpIGVPYmplY3Q7CisJCQkJYWRkRXh0ZXJuYWxSZXNvdXJjZShlVHlwZWRFbGVtZW50LmdldEVUeXBlKCksIGVQYWNrYWdlLAorCQkJCQkJcmVzb3VyY2VUYWJsZSk7CisJCQl9CisJCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIEVDbGFzcykgeworCQkJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlT2JqZWN0OworCQkJCUVDbGFzcyBzdXBlclR5cGU7CisJCQkJZm9yIChJdGVyYXRvciBpID0gZUNsYXNzLmdldEVTdXBlclR5cGVzKCkuaXRlcmF0b3IoKTsgaQorCQkJCQkJLmhhc05leHQoKTsgYWRkRXh0ZXJuYWxSZXNvdXJjZShzdXBlclR5cGUsIGVQYWNrYWdlLAorCQkJCQkJcmVzb3VyY2VUYWJsZSkpCisJCQkJCXN1cGVyVHlwZSA9IChFQ2xhc3MpIGkubmV4dCgpOworCisJCQl9CisJCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIEVPcGVyYXRpb24pIHsKKwkJCQlFT3BlcmF0aW9uIGVPcGVyYXRpb24gPSAoRU9wZXJhdGlvbikgZU9iamVjdDsKKwkJCQlFQ2xhc3NpZmllciBleGNlcHRpb25UeXBlOworCQkJCWZvciAoSXRlcmF0b3IgaSA9IGVPcGVyYXRpb24uZ2V0RUV4Y2VwdGlvbnMoKS5pdGVyYXRvcigpOyBpCisJCQkJCQkuaGFzTmV4dCgpOyBhZGRFeHRlcm5hbFJlc291cmNlKGV4Y2VwdGlvblR5cGUsCisJCQkJCQllUGFja2FnZSwgcmVzb3VyY2VUYWJsZSkpCisJCQkJCWV4Y2VwdGlvblR5cGUgPSAoRUNsYXNzaWZpZXIpIGkubmV4dCgpOworCisJCQl9CisJCX0KKworCQlTdHJpbmcgdXJpOworCQlmb3IgKEl0ZXJhdG9yIHJpID0gcmVzb3VyY2VUYWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOyByaS5oYXNOZXh0KCk7IHdyaXRlbG4oImltcG9ydCBcIiIKKwkJCQkrIHVyaSArICJcIjsiKSkgeworCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJpLm5leHQoKTsKKwkJCXVyaSA9IHJlc291cmNlLmdldFVSSSgpLnRvU3RyaW5nKCk7CisJCX0KKworCQlpZiAocmVzb3VyY2VUYWJsZS5zaXplKCkgPiAwKQorCQkJd3JpdGVsbigpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRFeHRlcm5hbFJlc291cmNlKEVDbGFzc2lmaWVyIHJlZmVyZW5jZWRUeXBlLAorCQkJRVBhY2thZ2UgbG9jYWxNYWluUGFja2FnZSwgSGFzaHRhYmxlIHJlc291cmNlVGFibGUpIHsKKwkJaWYgKHJlZmVyZW5jZWRUeXBlID09IG51bGwpCisJCQlyZXR1cm47CisJCVJlc291cmNlIHJlc291cmNlID0gcmVmZXJlbmNlZFR5cGUuZVJlc291cmNlKCk7CisJCWlmIChyZXNvdXJjZSA9PSBudWxsKQorCQkJcmV0dXJuOworCQlpZiAobG9jYWxNYWluUGFja2FnZS5lUmVzb3VyY2UoKS5lcXVhbHMocmVzb3VyY2UpKQorCQkJcmV0dXJuOworCQlpZiAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lcXVhbHMocmVmZXJlbmNlZFR5cGUuZ2V0RVBhY2thZ2UoKSkpCisJCQlyZXR1cm47CisJCWlmICghcmVzb3VyY2VUYWJsZS5jb250YWluc0tleShyZXNvdXJjZSkpCisJCQlyZXNvdXJjZVRhYmxlLnB1dChyZXNvdXJjZSwgcmVzb3VyY2UpOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZVN1YlBhY2thZ2UoRVBhY2thZ2UgZVBhY2thZ2UsIGludCBpbmRlbnRMZXZlbCkgeworCQlTdHJpbmcgbmFtZSA9IGVzY2FwZShlUGFja2FnZS5nZXROYW1lKCkpOworCQl3cml0ZUFubm90YXRpb25zKGVQYWNrYWdlLCBpbmRlbnRMZXZlbCwgZmFsc2UpOworCQl3cml0ZU5hbWVzcGFjZUluZm8oZVBhY2thZ2UsIGluZGVudExldmVsKTsKKwkJd3JpdGVsbigicGFja2FnZSAiICsgbmFtZSArICIgeyIsIGluZGVudExldmVsKTsKKwkJd3JpdGVQYWNrYWdlQ29udGVudHMoZVBhY2thZ2UsIGluZGVudExldmVsICsgMSk7CisJCXdyaXRlbG4oIn0iLCBpbmRlbnRMZXZlbCk7CisJCXdyaXRlbG4oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVOYW1lc3BhY2VJbmZvKEVQYWNrYWdlIGVQYWNrYWdlLCBpbnQgaW5kZW50TGV2ZWwpIHsKKwkJaWYgKGVQYWNrYWdlLmdldE5zVVJJKCkgPT0gbnVsbCAmJiBlUGFja2FnZS5nZXROc1ByZWZpeCgpID09IG51bGwpCisJCQlyZXR1cm47CisJCXdyaXRlKCJAbmFtZXNwYWNlKCIsIGluZGVudExldmVsKTsKKwkJaWYgKGVQYWNrYWdlLmdldE5zVVJJKCkgIT0gbnVsbCkgeworCQkJd3JpdGUoInVyaT1cIiIgKyBlUGFja2FnZS5nZXROc1VSSSgpICsgIlwiIik7CisJCQlpZiAoZVBhY2thZ2UuZ2V0TnNQcmVmaXgoKSAhPSBudWxsKQorCQkJCXdyaXRlKCIsICIpOworCQl9CisJCWlmIChlUGFja2FnZS5nZXROc1ByZWZpeCgpICE9IG51bGwpCisJCQl3cml0ZSgicHJlZml4PVwiIiArIGVQYWNrYWdlLmdldE5zUHJlZml4KCkgKyAiXCIiKTsKKwkJd3JpdGVsbigiKSIpOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZVBhY2thZ2VDb250ZW50cyhFUGFja2FnZSBlUGFja2FnZSwgaW50IGluZGVudExldmVsKSB7CisJCWZvciAoSXRlcmF0b3IgaWMgPSBlUGFja2FnZS5nZXRFQ2xhc3NpZmllcnMoKS5pdGVyYXRvcigpOyBpYy5oYXNOZXh0KCk7KSB7CisJCQlPYmplY3QgbyA9IGljLm5leHQoKTsKKwkJCWlmIChvIGluc3RhbmNlb2YgRUNsYXNzKSB7CisJCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIG87CisJCQkJd3JpdGVDbGFzcyhlQ2xhc3MsIGluZGVudExldmVsKTsKKwkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEVFbnVtKSB7CisJCQkJRUVudW0gZUVudW0gPSAoRUVudW0pIG87CisJCQkJd3JpdGVFbnVtKGVFbnVtLCBpbmRlbnRMZXZlbCk7CisJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBFRGF0YVR5cGUpIHsKKwkJCQlFRGF0YVR5cGUgZURhdGFUeXBlID0gKEVEYXRhVHlwZSkgbzsKKwkJCQl3cml0ZURhdGFUeXBlKGVEYXRhVHlwZSwgaW5kZW50TGV2ZWwpOworCQkJfQorCQl9CisKKwkJRVBhY2thZ2Ugc3ViUGFja2FnZTsKKwkJZm9yIChJdGVyYXRvciBpcCA9IGVQYWNrYWdlLmdldEVTdWJwYWNrYWdlcygpLml0ZXJhdG9yKCk7IGlwLmhhc05leHQoKTsgd3JpdGVTdWJQYWNrYWdlKAorCQkJCXN1YlBhY2thZ2UsIGluZGVudExldmVsKSkKKwkJCXN1YlBhY2thZ2UgPSAoRVBhY2thZ2UpIGlwLm5leHQoKTsKKworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUNsYXNzKEVDbGFzcyBlQ2xhc3MsIGludCBpbmRlbnRMZXZlbCkgeworCQl3cml0ZUFubm90YXRpb25zKGVDbGFzcywgaW5kZW50TGV2ZWwsIGZhbHNlKTsKKwkJaW5kZW50KGluZGVudExldmVsKTsKKwkJaWYgKGVDbGFzcy5pc0Fic3RyYWN0KCkpCisJCQl3cml0ZSgiYWJzdHJhY3QgIik7CisJCWlmIChlQ2xhc3MuaXNJbnRlcmZhY2UoKSkKKwkJCXdyaXRlKCJpbnRlcmZhY2UgIik7CisJCWVsc2UKKwkJCXdyaXRlKCJjbGFzcyAiKTsKKwkJU3RyaW5nIG5hbWUgPSBlc2NhcGUoZUNsYXNzLmdldE5hbWUoKSk7CisJCXdyaXRlKG5hbWUpOworCQlib29sZWFuIGZpcnN0U3VwZXJUeXBlID0gdHJ1ZTsKKworCQl3cml0ZVR5cGVQYXJhbXMoZUNsYXNzLmdldEVUeXBlUGFyYW1ldGVycygpLCBlQ2xhc3MpOworCisJCWZvciAoSXRlcmF0b3I8RUdlbmVyaWNUeXBlPiBpc3QgPSBlQ2xhc3MuZ2V0RUdlbmVyaWNTdXBlclR5cGVzKCkKKwkJCQkuaXRlcmF0b3IoKTsgaXN0Lmhhc05leHQoKTspIHsKKwkJCWlmIChmaXJzdFN1cGVyVHlwZSkgeworCQkJCXdyaXRlKCIgZXh0ZW5kcyAiKTsKKwkJCQlmaXJzdFN1cGVyVHlwZSA9IGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQl3cml0ZSgiLCAiKTsKKwkJCX0KKwkJCUVHZW5lcmljVHlwZSBzdXBlclR5cGUgPSBpc3QubmV4dCgpOworCQkJU3RyaW5nIHN1cGVyVHlwZU5hbWUgPSBnZXRUeXBlTmFtZShzdXBlclR5cGUsIGVDbGFzcyk7CisJCQl3cml0ZShzdXBlclR5cGVOYW1lKTsKKwkJfQorCisJCWlmIChlQ2xhc3MuZ2V0SW5zdGFuY2VDbGFzc05hbWUoKSAhPSBudWxsKSB7CisJCQlTdHJpbmcgaW5zdGFuY2VDbGFzc05hbWUgPSBxdW90ZUlmTmVjZXNzYXJ5KGVDbGFzcworCQkJCQkuZ2V0SW5zdGFuY2VDbGFzc05hbWUoKSk7CisJCQl3cml0ZSgiIDogIiArIGluc3RhbmNlQ2xhc3NOYW1lKTsKKwkJfQorCQl3cml0ZWxuKCIgeyIpOworCQlmb3IgKEl0ZXJhdG9yPEVPcGVyYXRpb24+IGlvcCA9IGVDbGFzcy5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGlvcAorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlFT3BlcmF0aW9uIG8gPSBpb3AubmV4dCgpOworCQkJd3JpdGVPcGVyYXRpb24obywgaW5kZW50TGV2ZWwgKyAxLCBlQ2xhc3MpOworCQl9CisKKwkJZm9yIChJdGVyYXRvcjxFU3RydWN0dXJhbEZlYXR1cmU+IGlzZiA9IGVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKKwkJCQkuaXRlcmF0b3IoKTsgaXNmLmhhc05leHQoKTspIHsKKwkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBvMiA9IGlzZi5uZXh0KCk7CisJCQlpZiAobzIgaW5zdGFuY2VvZiBFQXR0cmlidXRlKQorCQkJCXdyaXRlQXR0cmlidXRlKChFQXR0cmlidXRlKSBvMiwgaW5kZW50TGV2ZWwgKyAxKTsKKwkJCWVsc2UgaWYgKG8yIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkKKwkJCQl3cml0ZVJlZmVyZW5jZSgoRVJlZmVyZW5jZSkgbzIsIGluZGVudExldmVsICsgMSk7CisJCX0KKworCQl3cml0ZWxuKCJ9IiwgaW5kZW50TGV2ZWwpOworCQl3cml0ZWxuKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlVHlwZVBhcmFtcyhFTGlzdDxFVHlwZVBhcmFtZXRlcj4gdHBzLCBFQ2xhc3MgZUNsYXNzKSB7CisJCUl0ZXJhdG9yPEVUeXBlUGFyYW1ldGVyPiB0cHNJdGVyID0gdHBzLml0ZXJhdG9yKCk7CisJCWlmICh0cHMuc2l6ZSgpID4gMCkgeworCQkJd3JpdGUoIiA8Iik7CisJCX0KKwkJd2hpbGUgKHRwc0l0ZXIuaGFzTmV4dCgpKSB7CisJCQlFVHlwZVBhcmFtZXRlciBldHAgPSB0cHNJdGVyLm5leHQoKTsKKwkJCXdyaXRlKGdldFR5cGVOYW1lKGV0cCwgZUNsYXNzKSk7CisJCQlpZiAodHBzSXRlci5oYXNOZXh0KCkpIHsKKwkJCQl3cml0ZSgiLCAiKTsKKwkJCX0KKwkJfQorCQlpZiAodHBzLnNpemUoKSA+IDApIHsKKwkJCXdyaXRlKCI+ICIpOworCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VHlwZU5hbWUoRVR5cGVQYXJhbWV0ZXIgZXRwLCBFQ2xhc3MgY29udGV4dCkgeworCQlTdHJpbmcgcmVzID0gZXNjYXBlKGV0cC5nZXROYW1lKCkpOworCQlpZiAoZXRwLmdldEVCb3VuZHMoKS5zaXplKCkgPiAwKSB7CisJCQlyZXMgKz0gIiBleHRlbmRzICI7CisJCQlJdGVyYXRvcjxFR2VuZXJpY1R5cGU+IGl0ZXJCID0gZXRwLmdldEVCb3VuZHMoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXJCLmhhc05leHQoKSkgeworCQkJCUVHZW5lcmljVHlwZSBiID0gaXRlckIubmV4dCgpOworCQkJCXJlcyArPSBnZXRUeXBlTmFtZShiLCBjb250ZXh0KTsKKwkJCQlpZiAoaXRlckIuaGFzTmV4dCgpKSB7CisJCQkJCXJlcyArPSAiICYgIjsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0ciwgaW50IGluZGVudExldmVsKSB7CisJCVN0cmluZyBuYW1lID0gZXNjYXBlKGVBdHRyLmdldE5hbWUoKSk7CisJCVN0cmluZyBtb2RpZmllcnMgPSBnZXRNb2RpZmllcnMoZUF0dHIpOworCQlTdHJpbmcgdHlwZSA9IGdldFR5cGVFeHByKGVBdHRyLCBlQXR0ci5nZXRFQ29udGFpbmluZ0NsYXNzKCkpOworCQlTdHJpbmcgZGVmYXVsdFZhbHVlRXhwciA9ICIiOworCQlpZiAoZUF0dHIuZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpICE9IG51bGwpCisJCQlpZiAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQm9vbGVhbigpLmVxdWFscyhlQXR0ci5nZXRFVHlwZSgpKSkKKwkJCQlkZWZhdWx0VmFsdWVFeHByID0gIiA9ICIgKyBlQXR0ci5nZXREZWZhdWx0VmFsdWVMaXRlcmFsKCk7CisJCQllbHNlIGlmIChFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVJbnQoKS5lcXVhbHMoZUF0dHIuZ2V0RVR5cGUoKSkpCisJCQkJZGVmYXVsdFZhbHVlRXhwciA9ICIgPSAiICsgZUF0dHIuZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpOworCQkJZWxzZSBpZiAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2hhcigpLmVxdWFscyhlQXR0ci5nZXRFVHlwZSgpKSkKKwkJCQlkZWZhdWx0VmFsdWVFeHByID0gIiA9ICciICsgZUF0dHIuZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpCisJCQkJCQkrICInIjsKKwkJCWVsc2UKKwkJCQlkZWZhdWx0VmFsdWVFeHByID0gIiA9IFwiIiArIGVBdHRyLmdldERlZmF1bHRWYWx1ZUxpdGVyYWwoKQorCQkJCQkJKyAiXCIiOworCQl3cml0ZUFubm90YXRpb25zKGVBdHRyLCBpbmRlbnRMZXZlbCwgdHJ1ZSk7CisJCXdyaXRlbG4obW9kaWZpZXJzICsgImF0dHIgIiArIHR5cGUgKyAiICIgKyBuYW1lICsgZGVmYXVsdFZhbHVlRXhwcgorCQkJCSsgIjsiLCBpbmRlbnRMZXZlbCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlUmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZiwgaW50IGluZGVudExldmVsKSB7CisJCVN0cmluZyByZWZLaW5kOworCQlpZiAoZVJlZi5pc0NvbnRhaW5tZW50KCkpCisJCQlyZWZLaW5kID0gInZhbCAiOworCQllbHNlIGlmIChlUmVmLmlzQ29udGFpbmVyKCkpCisJCQlyZWZLaW5kID0gInJlZiAiOworCQllbHNlCisJCQlyZWZLaW5kID0gInJlZiAiOworCQlTdHJpbmcgbmFtZSA9IGVzY2FwZShlUmVmLmdldE5hbWUoKSk7CisJCVN0cmluZyBtb2RpZmllcnMgPSBnZXRNb2RpZmllcnMoZVJlZik7CisJCVN0cmluZyB0eXBlID0gZ2V0VHlwZUV4cHIoZVJlZiwgZVJlZi5nZXRFQ29udGFpbmluZ0NsYXNzKCkpOworCQl3cml0ZUFubm90YXRpb25zKGVSZWYsIGluZGVudExldmVsLCB0cnVlKTsKKwkJd3JpdGVsbihtb2RpZmllcnMgKyByZWZLaW5kICsgdHlwZSArICIgIiArIG5hbWUgKyAiOyIsIGluZGVudExldmVsKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVPcGVyYXRpb24oRU9wZXJhdGlvbiBlT3AsIGludCBpbmRlbnRMZXZlbCwgRUNsYXNzIGNvbnRleHQpIHsKKworCQlTdHJpbmcgbmFtZSA9IGVzY2FwZShlT3AuZ2V0TmFtZSgpKTsKKwkJU3RyaW5nIG1vZGlmaWVycyA9IGdldE1vZGlmaWVycyhlT3ApOworCQlTdHJpbmcgdHlwZSA9ICJ2b2lkIjsKKwkJaWYgKGVPcC5nZXRFR2VuZXJpY1R5cGUoKSAhPSBudWxsKSB7CisJCQl0eXBlID0gZ2V0VHlwZUV4cHIoZU9wLCBlT3AuZ2V0RUNvbnRhaW5pbmdDbGFzcygpKTsKKwkJfQorCQl3cml0ZUFubm90YXRpb25zKGVPcCwgaW5kZW50TGV2ZWwsIHRydWUpOworCisJCXdyaXRlKG1vZGlmaWVycyArICJvcCAiLCBpbmRlbnRMZXZlbCk7CisJCXdyaXRlVHlwZVBhcmFtcyhlT3AuZ2V0RVR5cGVQYXJhbWV0ZXJzKCksIGNvbnRleHQpOworCQl3cml0ZSh0eXBlICsgIiAiICsgbmFtZSArICIoIik7CisJCWZvciAoSXRlcmF0b3I8RVBhcmFtZXRlcj4gaXAgPSBlT3AuZ2V0RVBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOyBpcAorCQkJCS5oYXNOZXh0KCk7KSB7CisJCQlFUGFyYW1ldGVyIGVQYXJhbSA9IGlwLm5leHQoKTsKKwkJCVN0cmluZyBwYXJhbURvYyA9IEVjb3JlVXRpbC5nZXREb2N1bWVudGF0aW9uKGVQYXJhbSk7CisJCQlpZiAocGFyYW1Eb2MgIT0gbnVsbCkKKwkJCQl3cml0ZSgiP1wiIiArIHBhcmFtRG9jICsgIlwiICIpOworCQkJU3RyaW5nIHBhcmFtTW9kcyA9IGdldE1vZGlmaWVycyhlUGFyYW0pOworCQkJU3RyaW5nIHBhcmFtTmFtZSA9IGVzY2FwZShlUGFyYW0uZ2V0TmFtZSgpKTsKKwkJCVN0cmluZyBwYXJhbVR5cGUgPSBnZXRUeXBlRXhwcihlUGFyYW0sIGVPcC5nZXRFQ29udGFpbmluZ0NsYXNzKCkpOworCQkJd3JpdGUocGFyYW1Nb2RzICsgcGFyYW1UeXBlICsgIiAiICsgcGFyYW1OYW1lKTsKKwkJCWlmIChpcC5oYXNOZXh0KCkpCisJCQkJd3JpdGUoIiwgIik7CisJCX0KKworCQl3cml0ZSgiKSIpOworCQlJdGVyYXRvcjxFR2VuZXJpY1R5cGU+IGllID0gZU9wLmdldEVHZW5lcmljRXhjZXB0aW9ucygpLml0ZXJhdG9yKCk7CisJCWlmIChpZS5oYXNOZXh0KCkpIHsKKwkJCXdyaXRlKCIgdGhyb3dzICIpOworCQkJd2hpbGUgKGllLmhhc05leHQoKSkgeworCQkJCUVHZW5lcmljVHlwZSBleGNlcHRpb25UeXBlID0gaWUubmV4dCgpOworCQkJCVN0cmluZyBleGNlcHRpb25UeXBlTmFtZSA9IGdldFR5cGVOYW1lKGV4Y2VwdGlvblR5cGUsIGVPcAorCQkJCQkJLmdldEVDb250YWluaW5nQ2xhc3MoKSk7CisJCQkJd3JpdGUoZXhjZXB0aW9uVHlwZU5hbWUpOworCQkJCWlmIChpZS5oYXNOZXh0KCkpCisJCQkJCXdyaXRlKCIsICIpOworCQkJfQorCQl9CisJCXdyaXRlbG4oIjsiKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVFbnVtKEVFbnVtIGVFbnVtLCBpbnQgaW5kZW50TGV2ZWwpIHsKKwkJLy8gVE9ETyBjYW4gYW4gZW51bSBkZWNsYXJlIHR5cGUgcGFyYW1ldGVycworCQl3cml0ZUFubm90YXRpb25zKGVFbnVtLCBpbmRlbnRMZXZlbCwgZmFsc2UpOworCQl3cml0ZSgiZW51bSAiLCBpbmRlbnRMZXZlbCk7CisJCVN0cmluZyBuYW1lID0gZXNjYXBlKGVFbnVtLmdldE5hbWUoKSk7CisJCXdyaXRlKG5hbWUpOworCQl3cml0ZWxuKCIgeyIpOworCQlmb3IgKEl0ZXJhdG9yIGllbCA9IGVFbnVtLmdldEVMaXRlcmFscygpLml0ZXJhdG9yKCk7IGllbC5oYXNOZXh0KCk7IHdyaXRlbG4oIjsiKSkgeworCQkJRUVudW1MaXRlcmFsIGVMaXQgPSAoRUVudW1MaXRlcmFsKSBpZWwubmV4dCgpOworCQkJd3JpdGVBbm5vdGF0aW9ucyhlTGl0LCBpbmRlbnRMZXZlbCArIDEsIHRydWUpOworCQkJd3JpdGUoZXNjYXBlKGVMaXQuZ2V0TmFtZSgpKSwgaW5kZW50TGV2ZWwgKyAxKTsKKwkJCXdyaXRlKCIgPSAiKTsKKwkJCXdyaXRlKEludGVnZXIudG9TdHJpbmcoZUxpdC5nZXRWYWx1ZSgpKSk7CisJCX0KKworCQl3cml0ZWxuKCJ9IiwgaW5kZW50TGV2ZWwpOworCQl3cml0ZWxuKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlRGF0YVR5cGUoRURhdGFUeXBlIGVEYXRhVHlwZSwgaW50IGluZGVudExldmVsKSB7CisJCS8vIFRPRE8gY2FuIGEgZGF0YXR5cGUgZGVjbGFyZSB0eXBlIHBhcmFtZXRlcnMKKwkJd3JpdGVBbm5vdGF0aW9ucyhlRGF0YVR5cGUsIGluZGVudExldmVsLCBmYWxzZSk7CisJCWluZGVudChpbmRlbnRMZXZlbCk7CisJCWlmICghZURhdGFUeXBlLmlzU2VyaWFsaXphYmxlKCkpCisJCQl3cml0ZSgidHJhbnNpZW50ICIpOworCQl3cml0ZSgiZGF0YXR5cGUgIik7CisJCVN0cmluZyBuYW1lID0gZXNjYXBlKGVEYXRhVHlwZS5nZXROYW1lKCkpOworCQl3cml0ZShuYW1lKTsKKwkJd3JpdGUoIiA6ICIpOworCQlTdHJpbmcgaW5zdGFuY2VDbGFzc05hbWUgPSBxdW90ZUlmTmVjZXNzYXJ5KGVEYXRhVHlwZQorCQkJCS5nZXRJbnN0YW5jZUNsYXNzTmFtZSgpKTsKKwkJd3JpdGUoaW5zdGFuY2VDbGFzc05hbWUpOworCQl3cml0ZWxuKCI7Iik7CisJCXdyaXRlbG4oKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd3JpdGVBbm5vdGF0aW9ucyhFTW9kZWxFbGVtZW50IGVNb2RlbEVsZW1lbnQsIGludCBpbmRlbnRMZXZlbCwKKwkJCWJvb2xlYW4gaW5pdGlhbE5ld2xpbmUpIHsKKwkJTGlzdCBhbm5vdGF0aW9ucyA9IGVNb2RlbEVsZW1lbnQuZ2V0RUFubm90YXRpb25zKCk7CisJCWlmIChhbm5vdGF0aW9ucy5pc0VtcHR5KCkpCisJCQlyZXR1cm47CisJCWlmIChpbml0aWFsTmV3bGluZSkKKwkJCXdyaXRlbG4oKTsKKwkJRUFubm90YXRpb24gZUFubm90YXRpb247CisJCWZvciAoSXRlcmF0b3IgaSA9IGFubm90YXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyB3cml0ZUFubm90YXRpb24oCisJCQkJZUFubm90YXRpb24sIGluZGVudExldmVsKSkKKwkJCWVBbm5vdGF0aW9uID0gKEVBbm5vdGF0aW9uKSBpLm5leHQoKTsKKworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZUFubm90YXRpb24oRUFubm90YXRpb24gZUFubm90YXRpb24sIGludCBpbmRlbnRMZXZlbCkgeworCQlib29sZWFuIGZpcnN0RGV0YWlsID0gdHJ1ZTsKKwkJU3RyaW5nIHNvdXJjZVVSSSA9IGVBbm5vdGF0aW9uLmdldFNvdXJjZSgpOworCQlpbnQgZGV0YWlsc0NvdW50ID0gZUFubm90YXRpb24uZ2V0RGV0YWlscygpLnNpemUoKTsKKwkJU3RyaW5nIHNvdXJjZUxhYmVsID0gX2Fubm90YXRpb25NYXAuZ2V0TGFiZWxGb3JTb3VyY2VVUkkoc291cmNlVVJJLAorCQkJCWRldGFpbHNDb3VudCk7CisJCVN0cmluZyBvdXRwdXRTb3VyY2VVUkkgPSBzb3VyY2VMYWJlbCA9PSBudWxsID8gc291cmNlVVJJIDogc291cmNlTGFiZWw7CisJCUl0ZXJhdG9yIGkgPSBlQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuaXRlcmF0b3IoKTsKKwkJaWYgKCFpLmhhc05leHQoKSkgeworCQkJd3JpdGVsbigiQCIgKyBxdW90ZUlmTmVjZXNzYXJ5KG91dHB1dFNvdXJjZVVSSSksIGluZGVudExldmVsKTsKKwkJCXJldHVybjsKKwkJfQorCQl3cml0ZSgiQCIgKyBxdW90ZUlmTmVjZXNzYXJ5KG91dHB1dFNvdXJjZVVSSSkgKyAiKCIsIGluZGVudExldmVsKTsKKwkJaW50IGluZGV4ID0gLTE7CisJCXdoaWxlIChpLmhhc05leHQoKSkgeworCQkJaW5kZXgrKzsKKwkJCWphdmEudXRpbC5NYXAuRW50cnkgbWFwRW50cnkgPSAoamF2YS51dGlsLk1hcC5FbnRyeSkgaS5uZXh0KCk7CisJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgbWFwRW50cnkuZ2V0S2V5KCk7CisJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBtYXBFbnRyeS5nZXRWYWx1ZSgpOworCQkJU3RyaW5nIGltcGxpY2l0S2V5ID0gX2Fubm90YXRpb25NYXAuZ2V0SW1wbGljaXRLZXlOYW1lKHNvdXJjZVVSSSwKKwkJCQkJaW5kZXgsIGRldGFpbHNDb3VudCk7CisJCQlTdHJpbmcgZXhwciA9IG51bGw7CisJCQlpZiAoaW1wbGljaXRLZXkgIT0gbnVsbCkKKwkJCQlleHByID0gcXVvdGUodmFsdWUpOworCQkJZWxzZQorCQkJCWV4cHIgPSBxdW90ZUlmTmVjZXNzYXJ5KGtleSkgKyAiPSIgKyBxdW90ZSh2YWx1ZSk7CisJCQlpZiAoZmlyc3REZXRhaWwpIHsKKwkJCQl3cml0ZShleHByKTsKKwkJCQlmaXJzdERldGFpbCA9IGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQl3cml0ZSgiLCAiICsgZXhwcik7CisJCQl9CisJCQlpZiAoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDQvRW1mYXRpY0Fubm90YXRpb25NYXAiCisJCQkJCS5lcXVhbHMoZUFubm90YXRpb24uZ2V0U291cmNlKCkpKQorCQkJCV9hbm5vdGF0aW9uTWFwLmFkZE1hcHBpbmcoa2V5LCB2YWx1ZSk7CisJCX0KKwkJd3JpdGVsbigiKSIpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldE1vZGlmaWVycyhFVHlwZWRFbGVtZW50IGVUeXBlZEVsZW1lbnQpIHsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpZiAoIWVUeXBlZEVsZW1lbnQuaXNVbmlxdWUoKSkKKwkJCXNiLmFwcGVuZCgiIXVuaXF1ZSAiKTsKKwkJaWYgKCFlVHlwZWRFbGVtZW50LmlzT3JkZXJlZCgpKQorCQkJc2IuYXBwZW5kKCIhb3JkZXJlZCAiKTsKKwkJaWYgKGVUeXBlZEVsZW1lbnQgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpCisJCQlnZXRNb2RpZmllcnNIZWxwZXIoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZVR5cGVkRWxlbWVudCwgc2IpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZ2V0TW9kaWZpZXJzSGVscGVyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsCisJCQlTdHJpbmdCdWZmZXIgc2IpIHsKKwkJaWYgKCFlU3RydWN0dXJhbEZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkpCisJCQlzYi5hcHBlbmQoInJlYWRvbmx5ICIpOworCQlpZiAoZVN0cnVjdHVyYWxGZWF0dXJlLmlzVm9sYXRpbGUoKSkKKwkJCXNiLmFwcGVuZCgidm9sYXRpbGUgIik7CisJCWlmIChlU3RydWN0dXJhbEZlYXR1cmUuaXNUcmFuc2llbnQoKSkKKwkJCXNiLmFwcGVuZCgidHJhbnNpZW50ICIpOworCQlpZiAoZVN0cnVjdHVyYWxGZWF0dXJlLmlzVW5zZXR0YWJsZSgpKQorCQkJc2IuYXBwZW5kKCJ1bnNldHRhYmxlICIpOworCQlpZiAoZVN0cnVjdHVyYWxGZWF0dXJlLmlzRGVyaXZlZCgpKQorCQkJc2IuYXBwZW5kKCJkZXJpdmVkICIpOworCQlpZiAoZVN0cnVjdHVyYWxGZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgeworCQkJRUF0dHJpYnV0ZSBlQXR0ciA9IChFQXR0cmlidXRlKSBlU3RydWN0dXJhbEZlYXR1cmU7CisJCQlpZiAoZUF0dHIuaXNJRCgpKQorCQkJCXNiLmFwcGVuZCgiaWQgIik7CisJCX0KKwkJaWYgKGVTdHJ1Y3R1cmFsRmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKKwkJCUVSZWZlcmVuY2UgZVJlZiA9IChFUmVmZXJlbmNlKSBlU3RydWN0dXJhbEZlYXR1cmU7CisJCQlpZiAoIWVSZWYuaXNSZXNvbHZlUHJveGllcygpKQorCQkJCXNiLmFwcGVuZCgiIXJlc29sdmUgIik7CisJCX0KKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRUeXBlRXhwcihFVHlwZWRFbGVtZW50IGVUeXBlZEVsZW1lbnQsIEVDbGFzcyBjb250ZXh0KSB7CisJCVN0cmluZyB0eXBlTmFtZSA9IGdldFR5cGVOYW1lKGVUeXBlZEVsZW1lbnQuZ2V0RUdlbmVyaWNUeXBlKCksIGNvbnRleHQpOworCQlTdHJpbmcgbXVsdGlwbGljaXR5ID0gZ2V0TXVsdGlwbGljaXR5KGVUeXBlZEVsZW1lbnQpOworCQlTdHJpbmcgb3Bwb3NpdGVOYW1lID0gIiI7CisJCWlmIChlVHlwZWRFbGVtZW50IGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgeworCQkJRVJlZmVyZW5jZSBlUmVmID0gKEVSZWZlcmVuY2UpIGVUeXBlZEVsZW1lbnQ7CisJCQlFUmVmZXJlbmNlIG9wcG9zaXRlID0gZVJlZi5nZXRFT3Bwb3NpdGUoKTsKKwkJCWlmIChvcHBvc2l0ZSAhPSBudWxsKQorCQkJCW9wcG9zaXRlTmFtZSA9ICIjIiArIGVzY2FwZShvcHBvc2l0ZS5nZXROYW1lKCkpOworCQl9CisJCXJldHVybiB0eXBlTmFtZSArIG11bHRpcGxpY2l0eSArIG9wcG9zaXRlTmFtZTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRUeXBlTmFtZShFR2VuZXJpY1R5cGUgdHlwZSwgRUNsYXNzIGNvbnRleHQpIHsKKwkJaWYgKHR5cGUgPT0gbnVsbCkgeworCQkJcmV0dXJuICJudWxsIjsKKwkJfQorCQlpZiAoR2VuZXJpY3NVdGlsLmlzUmVmVG9UeXBlUGFyYW0odHlwZSkpIHsKKwkJCVN0cmluZyB0eXBlTmFtZSA9IGVzY2FwZSh0eXBlLmdldEVUeXBlUGFyYW1ldGVyKCkuZ2V0TmFtZSgpKTsKKwkJCXJldHVybiB0eXBlTmFtZTsKKwkJfQorCQlpZiAoR2VuZXJpY3NVdGlsLmlzV2lsZGNhcmQodHlwZSkpIHsKKwkJCVN0cmluZyByZXMgPSAiPyI7CisJCQlpZiAoR2VuZXJpY3NVdGlsLmlzVW5ib3VuZGVkV2lsZGNhcmQodHlwZSkpIHsKKwkJCQlyZXR1cm4gcmVzOworCQkJfQorCQkJaWYgKEdlbmVyaWNzVXRpbC5pc1VwcGVyQm91bmRlZFdpbGRjYXJkKHR5cGUpKSB7CisJCQkJRUdlbmVyaWNUeXBlIHViID0gdHlwZS5nZXRFVXBwZXJCb3VuZCgpOworCQkJCXJlcyArPSAiIGV4dGVuZHMgIiArIGdldFR5cGVOYW1lKHViLCBjb250ZXh0KTsKKwkJCX0gZWxzZSB7CisJCQkJRUdlbmVyaWNUeXBlIGxiID0gdHlwZS5nZXRFTG93ZXJCb3VuZCgpOworCQkJCXJlcyArPSAiIHN1cGVyICIgKyBnZXRUeXBlTmFtZShsYiwgY29udGV4dCk7CisJCQl9CisJCQlyZXR1cm4gcmVzOworCQl9CisJCS8qCisJCSAqIG5vdyB3ZSBrbm93IHRoYXQgdHlwZSBpcyBlaXRoZXIgYSBwYXJhbWV0ZXJpemVkIHR5cGUsIGEgcmF3IHR5cGUKKwkJICogcmVmZXJlbmNlLCBvciBhIHJlZmVyZW5jZSB0byBhIG5vbi1nZW5lcmljIGNsYXNzaWZpZXIKKwkJICovCisJCWlmIChHZW5lcmljc1V0aWwuaXNQYXJhbWV0ZXJpemVkVHlwZSh0eXBlKSkgeworCQkJU3RyaW5nIHJlcyA9ICIiOworCQkJcmVzICs9IGdldENsYXNzaWZpZXJOYW1lKHR5cGUuZ2V0RUNsYXNzaWZpZXIoKSwgY29udGV4dCk7CisJCQlyZXMgKz0gIjwiOworCQkJSXRlcmF0b3I8RUdlbmVyaWNUeXBlPiBpdGVyVEEgPSB0eXBlLmdldEVUeXBlQXJndW1lbnRzKCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyVEEuaGFzTmV4dCgpKSB7CisJCQkJRUdlbmVyaWNUeXBlIHRhID0gaXRlclRBLm5leHQoKTsKKwkJCQlyZXMgKz0gZ2V0VHlwZU5hbWUodGEsIGNvbnRleHQpOworCQkJCWlmIChpdGVyVEEuaGFzTmV4dCgpKSB7CisJCQkJCXJlcyArPSAiLCAiOworCQkJCX0KKwkJCX0KKwkJCXJlcyArPSAiPiI7CisJCQlyZXR1cm4gcmVzOworCQl9CisJCVN0cmluZyByZXMgPSAiIjsKKwkJcmVzICs9IGdldENsYXNzaWZpZXJOYW1lKHR5cGUuZ2V0RUNsYXNzaWZpZXIoKSwgY29udGV4dCk7CisJCXJldHVybiByZXM7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NpZmllck5hbWUoRUNsYXNzaWZpZXIgdHlwZSwgRUNsYXNzIGNvbnRleHQpIHsKKwkJaWYgKHR5cGUgPT0gbnVsbCkKKwkJCXJldHVybiAibnVsbCI7CisJCWlmIChfcHJvY2Vzc2luZ0Vjb3JlKQorCQkJcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOworCQlTdHJpbmcgYmFzaWNUeXBlTmFtZSA9IEVtZmF0aWNCYXNpY1R5cGVzLkxvb2t1cEJhc2ljVHlwZU5hbWUodHlwZSk7CisJCWlmIChiYXNpY1R5cGVOYW1lICE9IG51bGwpCisJCQlyZXR1cm4gYmFzaWNUeXBlTmFtZTsKKwkJU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBnZXRRdWFsaWZpZWROYW1lKHR5cGUsIGNvbnRleHQpOworCQlpZiAocXVhbGlmaWVkTmFtZSA9PSBudWxsKQorCQkJcmV0dXJuICJudWxsIjsKKwkJZWxzZQorCQkJcmV0dXJuIGVzY2FwZShxdWFsaWZpZWROYW1lKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKEVDbGFzc2lmaWVyIHR5cGUsIEVDbGFzcyBjb250ZXh0KSB7CisJCVN0cmluZyBxTmFtZSA9IHR5cGUuZ2V0TmFtZSgpOworCQlmb3IgKEVQYWNrYWdlIGN1cnJQYWNrYWdlID0gdHlwZS5nZXRFUGFja2FnZSgpOyBjdXJyUGFja2FnZSAhPSBudWxsCisJCQkJJiYgIUVjb3JlVXRpbC5pc0FuY2VzdG9yKGN1cnJQYWNrYWdlLCBjb250ZXh0KTsgY3VyclBhY2thZ2UgPSBjdXJyUGFja2FnZQorCQkJCS5nZXRFU3VwZXJQYWNrYWdlKCkpCisJCQlxTmFtZSA9IGN1cnJQYWNrYWdlLmdldE5hbWUoKSArICIuIiArIHFOYW1lOworCQlyZXR1cm4gcU5hbWU7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TXVsdGlwbGljaXR5KEVUeXBlZEVsZW1lbnQgZVR5cGVkRWxlbWVudCkgeworCQlpbnQgbG93ZXJCb3VuZCA9IGVUeXBlZEVsZW1lbnQuZ2V0TG93ZXJCb3VuZCgpOworCQlpbnQgdXBwZXJCb3VuZCA9IGVUeXBlZEVsZW1lbnQuZ2V0VXBwZXJCb3VuZCgpOworCQlTdHJpbmcgbXVsdGlwbGljaXR5OworCQlpZiAobG93ZXJCb3VuZCA9PSAwICYmIHVwcGVyQm91bmQgPT0gLTEpCisJCQltdWx0aXBsaWNpdHkgPSAiKiI7CisJCWVsc2UgaWYgKGxvd2VyQm91bmQgPT0gMCAmJiB1cHBlckJvdW5kID09IDEpCisJCQltdWx0aXBsaWNpdHkgPSBudWxsOworCQllbHNlIGlmIChsb3dlckJvdW5kID09IDEgJiYgdXBwZXJCb3VuZCA9PSAtMSkKKwkJCW11bHRpcGxpY2l0eSA9ICIrIjsKKwkJZWxzZSBpZiAobG93ZXJCb3VuZCA9PSB1cHBlckJvdW5kKQorCQkJbXVsdGlwbGljaXR5ID0gZ2V0Qm91bmRTdHJpbmcobG93ZXJCb3VuZCk7CisJCWVsc2UKKwkJCW11bHRpcGxpY2l0eSA9IGdldEJvdW5kU3RyaW5nKGxvd2VyQm91bmQpICsgIi4uIgorCQkJCQkrIGdldEJvdW5kU3RyaW5nKHVwcGVyQm91bmQpOworCQlpZiAobXVsdGlwbGljaXR5ID09IG51bGwpCisJCQltdWx0aXBsaWNpdHkgPSAiIjsKKwkJZWxzZQorCQkJbXVsdGlwbGljaXR5ID0gIlsiICsgbXVsdGlwbGljaXR5ICsgIl0iOworCQlyZXR1cm4gbXVsdGlwbGljaXR5OworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldEJvdW5kU3RyaW5nKGludCBtdWx0aXBsaWNpdHlCb3VuZCkgeworCQlpZiAobXVsdGlwbGljaXR5Qm91bmQgPT0gLTEpCisJCQlyZXR1cm4gIioiOworCQlpZiAobXVsdGlwbGljaXR5Qm91bmQgPT0gLTIpCisJCQlyZXR1cm4gIj8iOworCQllbHNlCisJCQlyZXR1cm4gSW50ZWdlci50b1N0cmluZyhtdWx0aXBsaWNpdHlCb3VuZCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgaWRlbnRpZmllcikgeworCQlyZXR1cm4gRW1mYXRpY0tleXdvcmRzLkVzY2FwZShpZGVudGlmaWVyKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBxdW90ZShTdHJpbmcgcykgeworCQlpZiAoX2VzY2FwZVF1b3RlcyA9PSBudWxsKQorCQkJX2VzY2FwZVF1b3RlcyA9IFBhdHRlcm4uY29tcGlsZSgiXCIiKTsKKwkJU3RyaW5nIHMyID0gX2VzY2FwZVF1b3Rlcy5tYXRjaGVyKHMpLnJlcGxhY2VBbGwoIlxcXFxcIiIpOworCQlyZXR1cm4gJyInICsgczIgKyAnIic7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgcXVvdGVJZk5lY2Vzc2FyeShTdHJpbmcgc3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQpIHsKKwkJaWYgKHN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEID09IG51bGwKKwkJCQl8fCBzdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRC5lcXVhbHMoIiIpKQorCQkJcmV0dXJuICJcIlwiIjsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRC5sZW5ndGgoKTsgaSsrKSB7CisJCQljaGFyIGMgPSBzdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRC5jaGFyQXQoaSk7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGMpKQorCQkJCQlyZXR1cm4gcXVvdGUoc3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQpOworCQkJfSBlbHNlIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpICYmIGMgIT0gJy4nKQorCQkJCXJldHVybiBxdW90ZShzdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCk7CisJCX0KKworCQlpZiAoRW1mYXRpY0tleXdvcmRzLklzS2V5d29yZChzdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCkpCisJCQlyZXR1cm4gcXVvdGUoc3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQpOworCQllbHNlCisJCQlyZXR1cm4gc3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlbG4oKSB7CisJCXdyaXRlbG4oIiIpOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZWxuKFN0cmluZyBzKSB7CisJCXdyaXRlbG4ocywgMCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlbG4oU3RyaW5nIHMsIGludCBpbmRlbnRMZXZlbCkgeworCQlpbmRlbnQoaW5kZW50TGV2ZWwpOworCQlfYnVmLmFwcGVuZChzICsgIlxuIik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHdyaXRlKFN0cmluZyBzKSB7CisJCV9idWYuYXBwZW5kKHMpOworCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZShTdHJpbmcgcywgaW50IGluZGVudExldmVsKSB7CisJCWluZGVudChpbmRlbnRMZXZlbCk7CisJCV9idWYuYXBwZW5kKHMpOworCX0KKworCXByaXZhdGUgdm9pZCBpbmRlbnQoaW50IHVuaXRzKSB7CisJCWludCBzcGFjZXMgPSB1bml0cyAqIDI7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3BhY2VzKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFjZXM7IGkrKykKKwkJCXNiLmFwcGVuZCgnICcpOworCisJCXdyaXRlKHNiLnRvU3RyaW5nKCkpOworCX0KKworCXByaXZhdGUgU3RyaW5nQnVmZmVyIF9idWY7CisKKwlwcml2YXRlIGJvb2xlYW4gX3Byb2Nlc3NpbmdFY29yZTsKKworCXByaXZhdGUgRW1mYXRpY0Fubm90YXRpb25NYXAgX2Fubm90YXRpb25NYXA7CisKKwlwcml2YXRlIFBhdHRlcm4gX2VzY2FwZVF1b3RlczsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ2lmeShFT2JqZWN0IGVjb3JlRGVjbCkgeworCQlXcml0ZXIgdyA9IG5ldyBXcml0ZXIoKTsKKwkJRVBhY2thZ2UgbWFpblBhY2thZ2UgPSBnZXRSb290RVBhY2thZ2UoZWNvcmVEZWNsKTsKKwkJaWYgKG1haW5QYWNrYWdlICE9IG51bGwpIHsKKwkJCXcuX3Byb2Nlc3NpbmdFY29yZSA9IHcuaW5pdFByb2Nlc3NpbmdFY29yZShtYWluUGFja2FnZSk7CisJCX0KKwkJdy5fYW5ub3RhdGlvbk1hcCA9IG5ldyBFbWZhdGljQW5ub3RhdGlvbk1hcCgpOworCQl3Ll9idWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWlmIChlY29yZURlY2wgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKKwkJCXcud3JpdGVDbGFzcygoRUNsYXNzKSBlY29yZURlY2wsIDApOworCQl9CisJCWlmIChlY29yZURlY2wgaW5zdGFuY2VvZiBFRGF0YVR5cGUpIHsKKwkJCXcud3JpdGVEYXRhVHlwZSgoRURhdGFUeXBlKSBlY29yZURlY2wsIDApOworCQl9CisJCWlmIChlY29yZURlY2wgaW5zdGFuY2VvZiBFRW51bSkgeworCQkJdy53cml0ZUVudW0oKEVFbnVtKSBlY29yZURlY2wsIDApOworCQl9CisJCWlmIChlY29yZURlY2wgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJCVN0cmluZyByZXMgPSBzdHJpbmdpZnkoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZWNvcmVEZWNsKTsKKwkJCXJldHVybiByZXM7CisJCX0KKwkJaWYgKGVjb3JlRGVjbCBpbnN0YW5jZW9mIEVUeXBlUGFyYW1ldGVyKSB7CisJCQlTdHJpbmcgcmVzID0gR2VuZXJpY3NVdGlsLmdldFRleHQoKEVUeXBlUGFyYW1ldGVyKSBlY29yZURlY2wpOworCQkJcmV0dXJuIHJlczsKKwkJfQorCQlpZiAoZWNvcmVEZWNsIGluc3RhbmNlb2YgRU9wZXJhdGlvbikgeworCQkJRU9wZXJhdGlvbiBlTyA9IChFT3BlcmF0aW9uKSBlY29yZURlY2w7CisJCQl3LndyaXRlT3BlcmF0aW9uKChFT3BlcmF0aW9uKSBlTywgMCwgZU8uZ2V0RUNvbnRhaW5pbmdDbGFzcygpKTsKKwkJfQorCQlTdHJpbmcgcmVzID0gdy5fYnVmLnRvU3RyaW5nKCk7CisJCXJldHVybiByZXM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRVBhY2thZ2UgZ2V0Um9vdEVQYWNrYWdlKEVPYmplY3QgZW8pIHsKKwkJRVBhY2thZ2Ugcm9vdCA9IG51bGw7CisJCWlmIChlbyBpbnN0YW5jZW9mIEVDbGFzc2lmaWVyKSB7CisJCQlyb290ID0gKChFQ2xhc3NpZmllcikgZW8pLmdldEVQYWNrYWdlKCk7CisJCX0KKwkJaWYgKGVvIGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCQlyb290ID0gKChFU3RydWN0dXJhbEZlYXR1cmUpIGVvKS5nZXRFQ29udGFpbmluZ0NsYXNzKCkKKwkJCQkJLmdldEVQYWNrYWdlKCk7CisJCX0KKwkJaWYgKGVvIGluc3RhbmNlb2YgRVR5cGVQYXJhbWV0ZXIpIHsKKwkJCWVvID0gKChFVHlwZVBhcmFtZXRlcikgZW8pLmVDb250YWluZXIoKTsKKwkJCXJvb3QgPSBnZXRSb290RVBhY2thZ2UoZW8pOworCQkJcmV0dXJuIHJvb3Q7CisJCX0KKwkJaWYgKHJvb3QgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJd2hpbGUgKHJvb3QuZ2V0RVN1cGVyUGFja2FnZSgpICE9IG51bGwpIHsKKwkJCXJvb3QgPSByb290LmdldEVTdXBlclBhY2thZ2UoKTsKKwkJfQorCQlyZXR1cm4gcm9vdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpbmdpZnkoRVN0cnVjdHVyYWxGZWF0dXJlIHNmKSB7CisJCVdyaXRlciB3ID0gbmV3IFdyaXRlcigpOworCQlFUGFja2FnZSBtYWluUGFja2FnZSA9IChFUGFja2FnZSkgc2YuZ2V0RUNvbnRhaW5pbmdDbGFzcygpCisJCQkJLmdldEVQYWNrYWdlKCk7CisJCXdoaWxlIChtYWluUGFja2FnZS5nZXRFU3VwZXJQYWNrYWdlKCkgIT0gbnVsbCkgeworCQkJbWFpblBhY2thZ2UgPSBtYWluUGFja2FnZS5nZXRFU3VwZXJQYWNrYWdlKCk7CisJCX0KKwkJdy5fcHJvY2Vzc2luZ0Vjb3JlID0gdy5pbml0UHJvY2Vzc2luZ0Vjb3JlKG1haW5QYWNrYWdlKTsKKwkJdy5fYW5ub3RhdGlvbk1hcCA9IG5ldyBFbWZhdGljQW5ub3RhdGlvbk1hcCgpOworCQl3Ll9idWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWlmIChzZiBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKKwkJCXcud3JpdGVBdHRyaWJ1dGUoKEVBdHRyaWJ1dGUpIHNmLCAwKTsKKwkJfQorCQlpZiAoc2YgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7CisJCQl3LndyaXRlUmVmZXJlbmNlKChFUmVmZXJlbmNlKSBzZiwgMCk7CisJCX0KKwkJU3RyaW5nIHJlcyA9IHcuX2J1Zi50b1N0cmluZygpOworCQlyZXR1cm4gcmVzOworCX0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VFc3NlbnRpYWxzKEVSZWZlcmVuY2UgZVJlZikgeworCQlXcml0ZXIgdyA9IG5ldyBXcml0ZXIoKTsKKwkJU3RyaW5nIG5hbWUgPSBlc2NhcGUoZVJlZi5nZXROYW1lKCkpOworCQlTdHJpbmcgdHlwZSA9IHcuZ2V0VHlwZUV4cHIoZVJlZiwgZVJlZi5nZXRFQ29udGFpbmluZ0NsYXNzKCkpOworCQlTdHJpbmcgcmVzID0gdHlwZSArICIgIiArIG5hbWUgOworCQlyZXR1cm4gcmVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF0dHJpYnV0ZUVzc2VudGlhbHMoRUF0dHJpYnV0ZSBlQXR0cikgeworCQlXcml0ZXIgdyA9IG5ldyBXcml0ZXIoKTsKKwkJU3RyaW5nIG5hbWUgPSBlc2NhcGUoZUF0dHIuZ2V0TmFtZSgpKTsKKwkJU3RyaW5nIHR5cGUgPSB3LmdldFR5cGVFeHByKGVBdHRyLCBlQXR0ci5nZXRFQ29udGFpbmluZ0NsYXNzKCkpOworCQlTdHJpbmcgZGVmYXVsdFZhbHVlRXhwciA9ICIiOworCQlpZiAoZUF0dHIuZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpICE9IG51bGwpCisJCQlpZiAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQm9vbGVhbigpLmVxdWFscyhlQXR0ci5nZXRFVHlwZSgpKSkKKwkJCQlkZWZhdWx0VmFsdWVFeHByID0gIiA9ICIgKyBlQXR0ci5nZXREZWZhdWx0VmFsdWVMaXRlcmFsKCk7CisJCQllbHNlIGlmIChFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVJbnQoKS5lcXVhbHMoZUF0dHIuZ2V0RVR5cGUoKSkpCisJCQkJZGVmYXVsdFZhbHVlRXhwciA9ICIgPSAiICsgZUF0dHIuZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpOworCQkJZWxzZSBpZiAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2hhcigpLmVxdWFscyhlQXR0ci5nZXRFVHlwZSgpKSkKKwkJCQlkZWZhdWx0VmFsdWVFeHByID0gIiA9ICciICsgZUF0dHIuZ2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgpCisJCQkJCQkrICInIjsKKwkJCWVsc2UKKwkJCQlkZWZhdWx0VmFsdWVFeHByID0gIiA9IFwiIiArIGVBdHRyLmdldERlZmF1bHRWYWx1ZUxpdGVyYWwoKQorCQkJCQkJKyAiXCIiOworCQlTdHJpbmcgcmVzID0gdHlwZSArICIgIiArIG5hbWUgKyBkZWZhdWx0VmFsdWVFeHByIDsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVyYXRpb25Fc3NlbnRpYWxzKEVPcGVyYXRpb24gZU9wKSB7CisJCVdyaXRlciB3ID0gbmV3IFdyaXRlcigpOworCQl3Ll9idWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCVN0cmluZyBuYW1lID0gZXNjYXBlKGVPcC5nZXROYW1lKCkpOworCQlTdHJpbmcgdHlwZSA9ICJ2b2lkIjsKKwkJaWYgKGVPcC5nZXRFR2VuZXJpY1R5cGUoKSAhPSBudWxsKSB7CisJCQl0eXBlID0gdy5nZXRUeXBlRXhwcihlT3AsIGVPcC5nZXRFQ29udGFpbmluZ0NsYXNzKCkpOworCQl9CisJCQorCQl3LndyaXRlVHlwZVBhcmFtcyhlT3AuZ2V0RVR5cGVQYXJhbWV0ZXJzKCksIGVPcC5nZXRFQ29udGFpbmluZ0NsYXNzKCkpOworCQl3LndyaXRlKHR5cGUgKyAiICIgKyBuYW1lICsgIigiKTsKKwkJZm9yIChJdGVyYXRvcjxFUGFyYW1ldGVyPiBpcCA9IGVPcC5nZXRFUGFyYW1ldGVycygpLml0ZXJhdG9yKCk7IGlwCisJCQkJLmhhc05leHQoKTspIHsKKwkJCUVQYXJhbWV0ZXIgZVBhcmFtID0gaXAubmV4dCgpOworCQkJU3RyaW5nIHBhcmFtRG9jID0gRWNvcmVVdGlsLmdldERvY3VtZW50YXRpb24oZVBhcmFtKTsKKwkJCWlmIChwYXJhbURvYyAhPSBudWxsKQorCQkJCXcud3JpdGUoIj9cIiIgKyBwYXJhbURvYyArICJcIiAiKTsKKwkJCVN0cmluZyBwYXJhbU1vZHMgPSB3LmdldE1vZGlmaWVycyhlUGFyYW0pOworCQkJU3RyaW5nIHBhcmFtTmFtZSA9IGVzY2FwZShlUGFyYW0uZ2V0TmFtZSgpKTsKKwkJCVN0cmluZyBwYXJhbVR5cGUgPSB3LmdldFR5cGVFeHByKGVQYXJhbSwgZU9wLmdldEVDb250YWluaW5nQ2xhc3MoKSk7CisJCQl3LndyaXRlKHBhcmFtTW9kcyArIHBhcmFtVHlwZSArICIgIiArIHBhcmFtTmFtZSk7CisJCQlpZiAoaXAuaGFzTmV4dCgpKQorCQkJCXcud3JpdGUoIiwgIik7CisJCX0KKworCQl3LndyaXRlKCIpIik7CisJCUl0ZXJhdG9yPEVHZW5lcmljVHlwZT4gaWUgPSBlT3AuZ2V0RUdlbmVyaWNFeGNlcHRpb25zKCkuaXRlcmF0b3IoKTsKKwkJaWYgKGllLmhhc05leHQoKSkgeworCQkJdy53cml0ZSgiIHRocm93cyAiKTsKKwkJCXdoaWxlIChpZS5oYXNOZXh0KCkpIHsKKwkJCQlFR2VuZXJpY1R5cGUgZXhjZXB0aW9uVHlwZSA9IGllLm5leHQoKTsKKwkJCQlTdHJpbmcgZXhjZXB0aW9uVHlwZU5hbWUgPSB3LmdldFR5cGVOYW1lKGV4Y2VwdGlvblR5cGUsIGVPcAorCQkJCQkJLmdldEVDb250YWluaW5nQ2xhc3MoKSk7CisJCQkJdy53cml0ZShleGNlcHRpb25UeXBlTmFtZSk7CisJCQkJaWYgKGllLmhhc05leHQoKSkKKwkJCQkJdy53cml0ZSgiLCAiKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdy5fYnVmLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJpY3MvdXRpbC9CaU11bHRpTWFwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJpY3MvdXRpbC9CaU11bHRpTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjZjU4MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmljcy91dGlsL0JpTXVsdGlNYXAuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyaWNzLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgQmlNdWx0aU1hcDxLLCBWPiB7CisJcHJpdmF0ZSBPbmVUb01hbnlNYXA8SywgVj4gZnN0MnNuZCA9IG5ldyBPbmVUb01hbnlNYXA8SywgVj4oKTsKKwlwcml2YXRlIE9uZVRvTWFueU1hcDxWLCBLPiBzbmQyZnN0ID0gbmV3IE9uZVRvTWFueU1hcDxWLCBLPigpOworCisJLyoqCisJICogb25seSBub24tbnVsbCBhcmdzIGFyZSBzdG9yZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBwdXQoSyBmc3QsIFYgc25kKSB7CisJCWlmIChmc3QgPT0gbnVsbCB8fCBzbmQgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCWZzdDJzbmQucHV0KGZzdCwgc25kKTsKKwkJc25kMmZzdC5wdXQoc25kLCBmc3QpOworCX0KKworCS8qKgorCSAqIG5ldmVyIHJldHVybnMgbnVsbCBidXQgZW1wdHkgc2V0CisJICovCisJcHVibGljIFNldDxWPiBnZXQoSyBrKSB7CisJCXJldHVybiBmc3Qyc25kLmdldChrKTsKKwl9CisKKwkvKioKKwkgKiBuZXZlciByZXR1cm5zIG51bGwgYnV0IGVtcHR5IHNldAorCSAqLworCXB1YmxpYyBTZXQ8Sz4gZ2V0SW52KFYgdikgeworCQlyZXR1cm4gc25kMmZzdC5nZXQodik7CisJfQorCisJcHVibGljIHZvaWQgY2xlYXIoKSB7CisJCWZzdDJzbmQuY2xlYXIoKTsKKwkJc25kMmZzdC5jbGVhcigpOworCX0KKworCXB1YmxpYyBTZXQ8Sz4ga2V5U2V0KCkgeworCQlyZXR1cm4gZnN0MnNuZC5rZXlTZXQoKTsKKwl9CisKKwlwdWJsaWMgQ29sbGVjdGlvbjxWPiB2YWx1ZXMoKSB7CisJCXJldHVybiBmc3Qyc25kLnZhbHVlcygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyaWNzL3V0aWwvRWNvcmVXYWxrZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmljcy91dGlsL0Vjb3JlV2Fsa2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MzFkZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmljcy91dGlsL0Vjb3JlV2Fsa2VyLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJpY3MudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVN3aXRjaDsKKworLyoqCisgKiBBbiBFY29yZVdhbGtlciBuYXZpZ2F0ZXMgdGhlIGZ1bGwgRWNvcmUgQWJzdHJhY3QgU3ludGF4IFRyZWUgKEFTVCkuIEl0CisgKiBpbXBsZW1lbnRzIHRoZSA8Y29kZT5hY2NlcHQ8L2NvZGU+IG9wZXJhdGlvbiBvZiB0aGUgVmlzaXRvciBwYXR0ZXJuIGZvciBhbgorICogRU1vZGVsRWxlbWVudCBvYmplY3QuIEluIHRoaXMgd2F5IHRoZSA8Y29kZT5hY2NlcHQ8L2NvZGU+IG9wZXJhdGlvbiBuZWVkCisgKiBub3QgYmUgcGFydCBvZiBFTW9kZWxFbGVtZW50CisgKiA8cD4KKyAqIFRoaXMgd2Fsa2VyIG5hdmlnYXRlcyB0aGUgRWNvcmUgQVNUIHByZS1vcmRlcjogdGhlIGN1cnJlbnQgbm9kZSBpcyB2aXNpdGVkLAorICogdGhlbiBpdHMgY2hpbGRyZW4uCisgKiA8cD4KKyAqIFVzZXJzIG11c3Qgc3ViY2xhc3MgRWNvcmVTd2l0Y2ggYW5kIGNhbGwKKyAqIDxjb2RlPndhbGsobWFpblBhY2thZ2UsIHZpc2l0b3IpPC9jb2RlPi4KKyAqIDxwPgorICogRXhhbXBsZSB1c2FnZToKKyAqIDxwPgorICogY2xhc3MgTXlWaXNpdG9yIGV4dGVuZHMgRWNvcmVTd2l0Y2ggeyAuLi4uIH0KKyAqIDxwPgorICogTXlWaXNpdG9yIHYgPSBuZXcgTXlWaXNpdG9yICgpOyA8YnI+CisgKiBFY29yZVdhbGtlciB3ID0gbmV3IEVjb3JlV2Fsa2VyKCk7IDxicj4KKyAqIE9iamVjdCByZXN1bHQgPSB3LndhbGsoZVAsIHYpOyA8YnI+CisgKiAKKyAqIEBzZWUgRWNvcmVTd2l0Y2gKKyAqLworcHVibGljIGNsYXNzIEVjb3JlV2Fsa2VyIHsKKworCS8qKgorCSAqIE5hdmlnYXRlcyB0aGUgY29tcGxldGUgQVNUIGFuZCBlbnN1cmVzIHRoYXQgZWFjaCBub2RlIGlzIHZpc2l0ZWQgYnkKKwkgKiA8Y29kZT52aXNpdG9yPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gZU1FCisJICogICAgICAgICAgICB0aGUgRU1vZGVsRWxlbWVudCB0byBiZSB2aXNpdGVkCisJICogQHBhcmFtIHZpc2l0b3IKKwkgKiAgICAgICAgICAgIHRoZSB2aXNpdG9yIHRoYXQgc2hvdWxkIHZpc2l0IHRoZSBleHByZXNzaW9uCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBFY29yZVN3aXRjaCB3YWxrKEVNb2RlbEVsZW1lbnQgZU1FLCBFY29yZVN3aXRjaCB2KSB7CisJCXYuZG9Td2l0Y2goZU1FKTsKKwkJdmlzaXRPd25lZFBhcnRzKGVNRSwgdik7CisJCXJldHVybiB2OworCX0KKworCXByaXZhdGUgRWNvcmVTd2l0Y2ggdmlzaXRPd25lZFBhcnRzKEVNb2RlbEVsZW1lbnQgZSwgRWNvcmVTd2l0Y2ggdikgeworCQkvLyB0aGUgYW5ub3RhdGlvbnMKKwkJZm9yIChPYmplY3Qgb2EgOiBlLmdldEVBbm5vdGF0aW9ucygpKSB7CisJCQlFQW5ub3RhdGlvbiBhID0gKEVBbm5vdGF0aW9uKSBvYTsKKwkJCXdhbGsoYSwgdik7CisJCQkvLyBkb24ndCByZXR1cm4geWV0CisJCX0KKwkJLy8gRVBhY2thZ2UKKwkJaWYgKGUgaW5zdGFuY2VvZiBFUGFja2FnZSkgeworCQkJRVBhY2thZ2UgZVAgPSAoRVBhY2thZ2UpIGU7CisJCQkvLyB2aXNpdCBvd25lZCBwYXJ0cyBhbmQgb25seSB0aGVuIHJldHVybgorCQkJLy8gaS5lLiB2aXNpdCBvd25lZCBjbGFzc2lmaWVycyBhbmQgdmlzaXQgc3VicGFja2FnZXMKKwkJCWZvciAoT2JqZWN0IG9DIDogZVAuZ2V0RUNsYXNzaWZpZXJzKCkpIHsKKwkJCQlFQ2xhc3NpZmllciBjID0gKEVDbGFzc2lmaWVyKSBvQzsKKwkJCQl3YWxrKGMsIHYpOworCQkJfQorCQkJZm9yIChPYmplY3Qgb3N1YlAgOiBlUC5nZXRFU3VicGFja2FnZXMoKSkgeworCQkJCUVQYWNrYWdlIHN1YlAgPSAoRVBhY2thZ2UpIG9zdWJQOworCQkJCXdhbGsoc3ViUCwgdik7CisJCQl9CisJCQlyZXR1cm4gdjsKKwkJfQorCQkvLyBFQ2xhc3NpZmllciBjYW4gYmUgRUNsYXNzIG9yIEVEYXRhVHlwZSAoRURhdGFUeXBlIGluIHR1cm4gY2FuIGJlCisJCS8vIEVFbnVtKQorCQlpZiAoZSBpbnN0YW5jZW9mIEVDbGFzcykgeworCQkJRUNsYXNzIGVDID0gKEVDbGFzcykgZTsKKwkJCS8vIHZpc2l0IHRoZSBvd25lZCBhdHRyaWJ1dGVzCisJCQlmb3IgKE9iamVjdCBvQSA6IGVDLmdldEVBdHRyaWJ1dGVzKCkpIHsKKwkJCQlFQXR0cmlidXRlIGEgPSAoRUF0dHJpYnV0ZSkgb0E7CisJCQkJLy8gYW4gYXR0cmlidXRlIGhhcyBubyBvd25lZCBwYXJ0cywgdGhlcmVmb3JlIGRvbid0IHdhbGsgaXQKKwkJCQl2LmRvU3dpdGNoKGEpOworCQkJfQorCQkJLy8gdmlzaXQgdGhlIG93bmVkIHJlZmVyZW5jZXMKKwkJCWZvciAoT2JqZWN0IG9SIDogZUMuZ2V0RVJlZmVyZW5jZXMoKSkgeworCQkJCUVSZWZlcmVuY2UgciA9IChFUmVmZXJlbmNlKSBvUjsKKwkJCQl2LmRvU3dpdGNoKHIpOworCQkJfQorCQkJLy8gdmlzaXQgdGhlIG93bmVkIG9wZXJhdGlvbnMKKwkJCWZvciAoT2JqZWN0IG9PIDogZUMuZ2V0RU9wZXJhdGlvbnMoKSkgeworCQkJCUVPcGVyYXRpb24gbyA9IChFT3BlcmF0aW9uKSBvTzsKKwkJCQl2LmRvU3dpdGNoKG8pOworCQkJCS8vIHZpc2l0IHRoZSBvd25lZCBmb3JtYWwgcGFyYW1ldGVycworCQkJCWZvciAoT2JqZWN0IG9wIDogby5nZXRFUGFyYW1ldGVycygpKSB7CisJCQkJCUVQYXJhbWV0ZXIgcCA9IChFUGFyYW1ldGVyKSBvcDsKKwkJCQkJdi5kb1N3aXRjaChwKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdjsKKwkJfQorCQlpZiAoZSBpbnN0YW5jZW9mIEVEYXRhVHlwZSkgeworCQkJLy8gaGFuZGxlIEVFbnVtCisJCQlpZiAoZSBpbnN0YW5jZW9mIEVFbnVtKSB7CisJCQkJRUVudW0gZWUgPSAoRUVudW0pIGU7CisJCQkJLy8gdGhlIGVudW0gaXRzZWxmIHdhcyBhbHJlYWR5IHZpc2l0ZWQgYnkgdmlydHVlIG9mIGl0IGJlaW5nIGFuCisJCQkJLy8gRUNsYXNzaWZpZXIKKwkJCQlmb3IgKE9iamVjdCBlTCA6IGVlLmdldEVMaXRlcmFscygpKSB7CisJCQkJCUVFbnVtTGl0ZXJhbCBlZUwgPSAoRUVudW1MaXRlcmFsKSBlTDsKKwkJCQkJdi5kb1N3aXRjaChlZUwpOworCQkJCX0KKwkJCQlyZXR1cm4gdjsKKwkJCX0KKwkJCS8vIGl0J3MgYSBub24tRUVudW0gRURhdGFUeXBlCisJCQlFRGF0YVR5cGUgZUQgPSAoRURhdGFUeXBlKSBlOworCQkJLy8gdGhlIGRhdGF0eXBlIGl0c2VsZiB3YXMgYWxyZWFkeSB2aXNpdGVkIGJ5IHZpcnR1ZSBvZiBpdCBiZWluZyBhbgorCQkJLy8gRUNsYXNzaWZpZXIKKwkJCXJldHVybiB2OworCQl9CisJCXJldHVybiB2OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJpY3MvdXRpbC9HZW5lcmljc1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmljcy91dGlsL0dlbmVyaWNzVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZGIwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJpY3MvdXRpbC9HZW5lcmljc1V0aWwuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmljcy51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUdlbmVyaWNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRGlhZ25vc3RpY2lhbjsKKworcHVibGljIGNsYXNzIEdlbmVyaWNzVXRpbCB7CisKKwlwdWJsaWMgc3RhdGljIEVHZW5lcmljVHlwZSBnZXRFR2VuZXJpY1R5cGUoRUNsYXNzaWZpZXIgcmVzQykgeworCQlFR2VuZXJpY1R5cGUgcmVzRyA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUdlbmVyaWNUeXBlKCk7CisJCXJlc0cuc2V0RUNsYXNzaWZpZXIocmVzQyk7CisJCXJldHVybiByZXNHOworCX0KKworCXB1YmxpYyBzdGF0aWMgRUdlbmVyaWNUeXBlIGdldEVMaXN0T2YoRUNsYXNzaWZpZXIgZWxlbWVudFR5cGUpIHsKKwkJRUdlbmVyaWNUeXBlIHJlcyA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUdlbmVyaWNUeXBlKCk7CisJCUVEYXRhVHlwZSBlTCA9IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUVMaXN0KCk7CisJCXJlcy5zZXRFQ2xhc3NpZmllcihlTCk7CisJCUVHZW5lcmljVHlwZSBndEVsZW1lbnRUeXBlID0gZ2V0RUdlbmVyaWNUeXBlKGVsZW1lbnRUeXBlKTsKKwkJcmVzLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGd0RWxlbWVudFR5cGUpOworCQlyZXR1cm4gcmVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgRUdlbmVyaWNUeXBlIGdldEVMaXN0T2YoRUdlbmVyaWNUeXBlIGVsZW1lbnRUeXBlKSB7CisJCUVHZW5lcmljVHlwZSByZXMgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVHZW5lcmljVHlwZSgpOworCQlFRGF0YVR5cGUgZUwgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVFTGlzdCgpOworCQlyZXMuc2V0RUNsYXNzaWZpZXIoZUwpOworCQlyZXMuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZWxlbWVudFR5cGUpOworCQlyZXR1cm4gcmVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgRUdlbmVyaWNUeXBlIGdldFJlZlRvVHlwZVBhcmFtKEVUeXBlUGFyYW1ldGVyIHJlZmVkVFApIHsKKwkJRUdlbmVyaWNUeXBlIHJlcyA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUdlbmVyaWNUeXBlKCk7CisJCXJlcy5zZXRFVHlwZVBhcmFtZXRlcihyZWZlZFRQKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVHZW5lcmljVHlwZSBnZXRVbmJvdW5kZWRXaWxkY2FyZCgpIHsKKwkJRUdlbmVyaWNUeXBlIHJlcyA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUdlbmVyaWNUeXBlKCk7CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIHN0YXRpYyBFR2VuZXJpY1R5cGUgZ2V0VXBwZXJCb3VuZGVkV2lsZGNhcmQoRUdlbmVyaWNUeXBlIGd0KSB7CisJCUVHZW5lcmljVHlwZSByZXMgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVHZW5lcmljVHlwZSgpOworCQlyZXMuc2V0RVVwcGVyQm91bmQoZ3QpOworCQlyZXR1cm4gcmVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgRUdlbmVyaWNUeXBlIGdldExvd2VyQm91bmRlZFdpbGRjYXJkKEVHZW5lcmljVHlwZSBndCkgeworCQlFR2VuZXJpY1R5cGUgcmVzID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFR2VuZXJpY1R5cGUoKTsKKwkJcmVzLnNldEVMb3dlckJvdW5kKGd0KTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVHZW5lcmljVHlwZSBnZXRQYXJhbWV0ZXJpemVkVHlwZShFQ2xhc3NpZmllciBkZWNsYXJlZFR5cGUsIExpc3Q8RUdlbmVyaWNUeXBlPiB0eXBlQXJncykgeworCQlFR2VuZXJpY1R5cGUgcmVzID0gZ2V0RUdlbmVyaWNUeXBlKGRlY2xhcmVkVHlwZSk7CisJCXJlcy5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZEFsbCh0eXBlQXJncyk7CisJCXJldHVybiByZXM7CisJfQorCisJLyoqCisJICogZnJvbSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRUdlbmVyaWNJdGVtUHJvdmlkZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXh0KEVHZW5lcmljVHlwZSBlR2VuZXJpY1R5cGUpIHsKKwkJRVR5cGVQYXJhbWV0ZXIgZVR5cGVQYXJhbWV0ZXIgPSBlR2VuZXJpY1R5cGUuZ2V0RVR5cGVQYXJhbWV0ZXIoKTsKKwkJaWYgKGVUeXBlUGFyYW1ldGVyICE9IG51bGwpIHsKKwkJCVN0cmluZyBuYW1lID0gZVR5cGVQYXJhbWV0ZXIuZ2V0TmFtZSgpOworCQkJcmV0dXJuIG5hbWUgPT0gbnVsbCA/ICJudWxsIiA6IG5hbWU7CisJCX0gZWxzZSB7CisJCQlFQ2xhc3NpZmllciBlQ2xhc3NpZmllciA9IGVHZW5lcmljVHlwZS5nZXRFQ2xhc3NpZmllcigpOworCQkJaWYgKGVDbGFzc2lmaWVyICE9IG51bGwpIHsKKwkJCQlMaXN0PEVHZW5lcmljVHlwZT4gZVR5cGVBcmd1bWVudHMgPSBlR2VuZXJpY1R5cGUuZ2V0RVR5cGVBcmd1bWVudHMoKTsKKwkJCQlpZiAoZVR5cGVBcmd1bWVudHMuaXNFbXB0eSgpKSB7CisJCQkJCVN0cmluZyBuYW1lID0gZUNsYXNzaWZpZXIuZ2V0TmFtZSgpOworCQkJCQlyZXR1cm4gbmFtZSA9PSBudWxsID8gIm51bGwiIDogbmFtZTsKKwkJCQl9IGVsc2UgeworCQkJCQlTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQkJCXJlc3VsdC5hcHBlbmQoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpKTsKKwkJCQkJcmVzdWx0LmFwcGVuZCgnPCcpOworCQkJCQlmb3IgKEl0ZXJhdG9yPEVHZW5lcmljVHlwZT4gaSA9IGVUeXBlQXJndW1lbnRzLml0ZXJhdG9yKCk7OykgeworCQkJCQkJcmVzdWx0LmFwcGVuZChnZXRUZXh0KGkubmV4dCgpKSk7CisJCQkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJCQlyZXN1bHQuYXBwZW5kKCIsICIpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZXN1bHQuYXBwZW5kKCc+Jyk7CisJCQkJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCUVHZW5lcmljVHlwZSBlVXBwZXJCb3VuZCA9IGVHZW5lcmljVHlwZS5nZXRFVXBwZXJCb3VuZCgpOworCQkJCWlmIChlVXBwZXJCb3VuZCAhPSBudWxsKSB7CisJCQkJCXJldHVybiAiPyBleHRlbmRzICIgKyBnZXRUZXh0KGVVcHBlckJvdW5kKTsKKwkJCQl9IGVsc2UgeworCQkJCQlFR2VuZXJpY1R5cGUgZUxvd2VyQm91bmQgPSBlR2VuZXJpY1R5cGUuZ2V0RUxvd2VyQm91bmQoKTsKKwkJCQkJaWYgKGVMb3dlckJvdW5kICE9IG51bGwpIHsKKwkJCQkJCXJldHVybiAiPyBzdXBlciAiICsgZ2V0VGV4dChlTG93ZXJCb3VuZCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZXR1cm4gIj8iOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogZnJvbSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRVR5cGVQYXJhbWV0ZXJJdGVtUHJvdmlkZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXh0KEVUeXBlUGFyYW1ldGVyIGVUeXBlUGFyYW1ldGVyKSB7CisJCWlmIChlVHlwZVBhcmFtZXRlci5nZXRFQm91bmRzKCkuaXNFbXB0eSgpKSB7CisJCQlTdHJpbmcgbmFtZSA9IGVUeXBlUGFyYW1ldGVyLmdldE5hbWUoKTsKKwkJCXJldHVybiBuYW1lID09IG51bGwgPyAibnVsbCIgOiBuYW1lOworCQl9IGVsc2UgeworCQkJU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJcmVzdWx0LmFwcGVuZChlVHlwZVBhcmFtZXRlci5nZXROYW1lKCkpOworCQkJcmVzdWx0LmFwcGVuZCgiIGV4dGVuZHMgIik7CisJCQlmb3IgKEl0ZXJhdG9yPEVHZW5lcmljVHlwZT4gaSA9IGVUeXBlUGFyYW1ldGVyLmdldEVCb3VuZHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKwkJCQlyZXN1bHQuYXBwZW5kKGdldFRleHQoaS5uZXh0KCkpKTsKKwkJCQlpZiAoaS5oYXNOZXh0KCkpIHsKKwkJCQkJcmVzdWx0LmFwcGVuZCgiICYgIik7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmVG9UeXBlUGFyYW0oRUdlbmVyaWNUeXBlIHR5cGUpIHsKKwkJYm9vbGVhbiByZXMgPSB0eXBlLmdldEVDbGFzc2lmaWVyKCkgPT0gbnVsbDsKKwkJcmVzICY9IHR5cGUuZ2V0RVR5cGVQYXJhbWV0ZXIoKSAhPSBudWxsOworCQlyZXR1cm4gcmVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dpbGRjYXJkKEVHZW5lcmljVHlwZSB0eXBlKSB7CisJCWJvb2xlYW4gcmVzID0gdHlwZS5nZXRFQ2xhc3NpZmllcigpID09IG51bGw7CisJCXJlcyAmPSB0eXBlLmdldEVUeXBlUGFyYW1ldGVyKCkgPT0gbnVsbDsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJpemVkVHlwZShFR2VuZXJpY1R5cGUgdHlwZSkgeworCQlib29sZWFuIHJlcyA9ICh0eXBlLmdldEVDbGFzc2lmaWVyKCkgIT0gbnVsbCkgJiYgKHR5cGUuZ2V0RVR5cGVBcmd1bWVudHMoKS5zaXplKCkgPiAwKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmVG9DbGFzc2lmaWVyKEVHZW5lcmljVHlwZSB0eXBlKSB7CisJCWJvb2xlYW4gcmVzID0gaXNQYXJhbWV0ZXJpemVkVHlwZSh0eXBlKSB8fCBpc1JlZlRvTm9uR2VuZXJpYyh0eXBlKSB8fCBpc1Jhd1R5cGVSZWZlcmVuY2UodHlwZSk7IAorCQlyZXR1cm4gcmVzOyAKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSYXdUeXBlUmVmZXJlbmNlKEVHZW5lcmljVHlwZSB0eXBlKSB7CisJCWJvb2xlYW4gcmVzID0gKHR5cGUuZ2V0RUNsYXNzaWZpZXIoKSAhPSBudWxsKSAmJiAodHlwZS5nZXRFVHlwZUFyZ3VtZW50cygpLnNpemUoKSA9PSAwKQorCQkJCSYmICh0eXBlLmdldEVDbGFzc2lmaWVyKCkuZ2V0RVR5cGVQYXJhbWV0ZXJzKCkuc2l6ZSgpID4gMCk7CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmVG9Ob25HZW5lcmljKEVHZW5lcmljVHlwZSB0eXBlKSB7CisJCWJvb2xlYW4gcmVzID0gKHR5cGUuZ2V0RUNsYXNzaWZpZXIoKSAhPSBudWxsKSAmJiAodHlwZS5nZXRFQ2xhc3NpZmllcigpLmdldEVUeXBlUGFyYW1ldGVycygpLnNpemUoKSA9PSAwKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbmJvdW5kZWRXaWxkY2FyZChFR2VuZXJpY1R5cGUgdHlwZSkgeworCQlib29sZWFuIHJlcyA9IGlzV2lsZGNhcmQodHlwZSkgJiYgKHR5cGUuZ2V0RVVwcGVyQm91bmQoKSA9PSBudWxsKSAmJiAodHlwZS5nZXRFTG93ZXJCb3VuZCgpID09IG51bGwpOworCQlyZXR1cm4gcmVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VwcGVyQm91bmRlZFdpbGRjYXJkKEVHZW5lcmljVHlwZSB0eXBlKSB7CisJCWJvb2xlYW4gcmVzID0gaXNXaWxkY2FyZCh0eXBlKSAmJiAodHlwZS5nZXRFVXBwZXJCb3VuZCgpICE9IG51bGwpOworCQlyZXR1cm4gcmVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvd2VyQm91bmRlZFdpbGRjYXJkKEVHZW5lcmljVHlwZSB0eXBlKSB7CisJCWJvb2xlYW4gcmVzID0gaXNXaWxkY2FyZCh0eXBlKSAmJiAodHlwZS5nZXRFTG93ZXJCb3VuZCgpICE9IG51bGwpOworCQlyZXR1cm4gcmVzOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlbGxGb3JtZWQoRUdlbmVyaWNUeXBlIGd0KSB7CisJCURpYWdub3N0aWNpYW4gZGlhZ25vc3RpY2lhbiA9IG5ldyBEaWFnbm9zdGljaWFuKCk7CisJCWZpbmFsIERpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGRpYWdub3N0aWNpYW4udmFsaWRhdGUoZ3QpOworCQlib29sZWFuIHJlcyA9IChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgPT0gRGlhZ25vc3RpYy5PSyk7CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0RGlhZ25vc3RpY01zZ3MoRUdlbmVyaWNUeXBlIGd0KSB7CisJCUxpc3Q8U3RyaW5nPiByZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJRGlhZ25vc3RpY2lhbiBkaWFnbm9zdGljaWFuID0gbmV3IERpYWdub3N0aWNpYW4oKTsKKwkJZmluYWwgRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gZGlhZ25vc3RpY2lhbi52YWxpZGF0ZShndCk7CisJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgPT0gRGlhZ25vc3RpYy5PSykgeworCQkJcmV0dXJuIHJlczsKKwkJfQorCQlmb3IgKERpYWdub3N0aWMgY2hpbGREaWFnbm9zdGljIDogZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpKSB7CisJCQlTdHJpbmcgbXNnID0gY2hpbGREaWFnbm9zdGljLmdldE1lc3NhZ2UoKTsKKwkJCXJlcy5hZGQobXNnKTsKKwkJfQorCQlyZXR1cm4gcmVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyaWNzL3V0aWwvT25lVG9NYW55TWFwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvZ2VuZXJpY3MvdXRpbC9PbmVUb01hbnlNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZhYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyaWNzL3V0aWwvT25lVG9NYW55TWFwLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmljcy51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIE9uZVRvTWFueU1hcDxLLCBWPiB7CisKKwlwcml2YXRlIE1hcDxLLCBTZXQ8Vj4+IG0gPSBuZXcgSGFzaE1hcDxLLCBTZXQ8Vj4+KCk7CisJcHJpdmF0ZSBNYXA8ViwgSz4gc25kMmZzdCA9IG5ldyBIYXNoTWFwPFYsIEs+KCk7CisKKwkvKioKKwkgKiBvbmx5IG5vbi1udWxsIGFyZ3MgYXJlIHN0b3JlZAorCSAqLworCXB1YmxpYyB2b2lkIHB1dChLIGssIFYgdikgeworCQlpZiAoayA9PSBudWxsIHx8IHYgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCXNuZDJmc3QucHV0KHYsayk7CisJCVNldDxWPiB2cyA9IG0uZ2V0KGspOworCQlpZiAodnMgIT0gbnVsbCkgeworCQkJdnMuYWRkKHYpOworCQl9IGVsc2UgeworCQkJdnMgPSBuZXcgSGFzaFNldDxWPigpOworCQkJdnMuYWRkKHYpOworCQkJbS5wdXQoaywgdnMpOworCQl9CisJfQorCisJLyoqCisJICogbmV2ZXIgcmV0dXJucyBudWxsIGJ1dCBlbXB0eSBzZXQKKwkgKi8KKwlwdWJsaWMgU2V0PFY+IGdldChLIGspIHsKKwkJaWYgKG0uZ2V0KGspID09IG51bGwpIHsKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbS5nZXQoayk7CisJCX0KKwl9CisJCisJcHVibGljIEsgZ2V0SW52KFYgdikgeworCQlyZXR1cm4gc25kMmZzdC5nZXQodik7CisJfQorCisJcHVibGljIHZvaWQgY2xlYXIoKSB7CisJCW0uY2xlYXIoKTsKKwl9CisKKwlwdWJsaWMgU2V0PEs+IGtleVNldCgpIHsKKwkJcmV0dXJuIG0ua2V5U2V0KCk7CisJfQorCisJcHVibGljIENvbGxlY3Rpb248Vj4gdmFsdWVzKCkgeworCQlDb2xsZWN0aW9uPFNldDxWPj4gY3N2ID0gbS52YWx1ZXMoKTsKKwkJU2V0PFY+IHJlcyA9IG5ldyBIYXNoU2V0PFY+KCk7CisJCWZvciAoU2V0PFY+IHZzIDogY3N2KSB7CisJCQlyZXMuYWRkQWxsKHZzKTsKKwkJfQorCQlyZXR1cm4gcmVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2dlbmVyaWNzL3V0aWwvT25lVG9PbmVNYXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmljcy91dGlsL09uZVRvT25lTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjMWU2MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9nZW5lcmljcy91dGlsL09uZVRvT25lTWFwLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmljcy51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgT25lVG9PbmVNYXA8SywgVj4geworCisJcHJpdmF0ZSBNYXA8SywgVj4gZnN0MnNuZCA9IG5ldyBIYXNoTWFwPEssIFY+KCk7CisJcHJpdmF0ZSBNYXA8ViwgSz4gc25kMmZzdCA9IG5ldyBIYXNoTWFwPFYsIEs+KCk7CisKKwkvKioKKwkgKiBvbmx5IG5vbi1udWxsIGFyZ3MgYXJlIHN0b3JlZAorCSAqLworCXB1YmxpYyB2b2lkIHB1dChLIGZzdCwgViBzbmQpIHsKKwkJaWYgKGZzdCA9PSBudWxsIHx8IHNuZCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJZnN0MnNuZC5wdXQoZnN0LCBzbmQpOworCQlzbmQyZnN0LnB1dChzbmQsIGZzdCk7CisJfQorCisJcHVibGljIFYgZ2V0KEsgaykgeworCQlyZXR1cm4gZnN0MnNuZC5nZXQoayk7CisJfQorCisJcHVibGljIEsgZ2V0SW52KFYgdikgeworCQlyZXR1cm4gc25kMmZzdC5nZXQodik7CisJfQorCisJcHVibGljIHZvaWQgY2xlYXIoKSB7CisJCWZzdDJzbmQuY2xlYXIoKTsKKwkJc25kMmZzdC5jbGVhcigpOworCX0KKworCXB1YmxpYyBTZXQ8Sz4ga2V5U2V0KCkgeworCQlyZXR1cm4gZnN0MnNuZC5rZXlTZXQoKTsKKwl9CisKKwlwdWJsaWMgQ29sbGVjdGlvbjxWPiB2YWx1ZXMoKSB7CisJCXJldHVybiBmc3Qyc25kLnZhbHVlcygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9BYnN0cmFjdE1vZGlmaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0Fic3RyYWN0TW9kaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzA1ZmEyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9BYnN0cmFjdE1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSw3MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIEFic3RyYWN0TW9kaWZpZXIgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSAgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1dfQUJTVFJBQ1QgPSAiYWJzdHJhY3QiOworCisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9hYnN0cmFjdF9LVzsKKworCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldEFic3RyYWN0X0tXKCkgeworCQlyZXR1cm4gX2Fic3RyYWN0X0tXOworCX0KKworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgQVNUTm9kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJaWYgKF9hYnN0cmFjdF9LVyAhPSBudWxsKSBjb3VudCsrOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCWludCBjb3VudCA9IC0xOworCQlpZiAoKF9hYnN0cmFjdF9LVyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfYWJzdHJhY3RfS1c7CisKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IEFic3RyYWN0TW9kaWZpZXIuCisJICovCisJcHVibGljIEFic3RyYWN0TW9kaWZpZXIoCisJCVRva2VuSW5mbyBhYnN0cmFjdF9LVworCSkgeworCQlzdXBlcigpOworCisJCWlmIChhYnN0cmFjdF9LVyAhPSBudWxsKSB7CisJCQlfYWJzdHJhY3RfS1cgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShhYnN0cmFjdF9LVyk7CisJCQlpZiAoX2Fic3RyYWN0X0tXLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9hYnN0cmFjdF9LVy5fcGFyZW50ID0gdGhpczsKKwkJfQorCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvQW5ub3RhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5ODhiMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvQW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbiBleHRlbmRzIEVtZmF0aWNBU1ROb2RlICB7CisKKworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfYXQ7CisJcHJpdmF0ZSBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBfc291cmNlOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfbHBhcmVuOworCXByaXZhdGUgS2V5RXF1YWxzVmFsdWVMaXN0IF9rZXlFcXVhbHNWYWx1ZUxpc3Q7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9ycGFyZW47CisKKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRBdCgpIHsKKwkJcmV0dXJuIF9hdDsKKwl9CisJcHVibGljIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIGdldFNvdXJjZSgpIHsKKwkJcmV0dXJuIF9zb3VyY2U7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldExwYXJlbigpIHsKKwkJcmV0dXJuIF9scGFyZW47CisJfQorCXB1YmxpYyBLZXlFcXVhbHNWYWx1ZUxpc3QgZ2V0S2V5RXF1YWxzVmFsdWVMaXN0KCkgeworCQlyZXR1cm4gX2tleUVxdWFsc1ZhbHVlTGlzdDsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0UnBhcmVuKCkgeworCQlyZXR1cm4gX3JwYXJlbjsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCWludCBjb3VudCA9IDA7CisJCWlmIChfYXQgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9zb3VyY2UgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9scGFyZW4gIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9rZXlFcXVhbHNWYWx1ZUxpc3QgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9ycGFyZW4gIT0gbnVsbCkgY291bnQrKzsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlpbnQgY291bnQgPSAtMTsKKwkJaWYgKChfYXQgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2F0OworCQlpZiAoKF9zb3VyY2UgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3NvdXJjZTsKKwkJaWYgKChfbHBhcmVuICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9scGFyZW47CisJCWlmICgoX2tleUVxdWFsc1ZhbHVlTGlzdCAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfa2V5RXF1YWxzVmFsdWVMaXN0OworCQlpZiAoKF9ycGFyZW4gIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3JwYXJlbjsKKworCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgQW5ub3RhdGlvbi4KKwkgKi8KKwlwdWJsaWMgQW5ub3RhdGlvbigKKwkJVG9rZW5JbmZvIGF0LAorCQlTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBzb3VyY2UsCisJCVRva2VuSW5mbyBscGFyZW4sCisJCUtleUVxdWFsc1ZhbHVlTGlzdCBrZXlFcXVhbHNWYWx1ZUxpc3QsCisJCVRva2VuSW5mbyBycGFyZW4KKwkpIHsKKwkJc3VwZXIoKTsKKworCQlpZiAoYXQgIT0gbnVsbCkgeworCQkJX2F0ID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoYXQpOworCQkJaWYgKF9hdC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfYXQuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKHNvdXJjZSAhPSBudWxsKSB7CisJCQlfc291cmNlID0gc291cmNlOworCQkJaWYgKF9zb3VyY2UuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3NvdXJjZS5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAobHBhcmVuICE9IG51bGwpIHsKKwkJCV9scGFyZW4gPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShscGFyZW4pOworCQkJaWYgKF9scGFyZW4uX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2xwYXJlbi5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoa2V5RXF1YWxzVmFsdWVMaXN0ICE9IG51bGwpIHsKKwkJCV9rZXlFcXVhbHNWYWx1ZUxpc3QgPSBrZXlFcXVhbHNWYWx1ZUxpc3Q7CisJCQlpZiAoX2tleUVxdWFsc1ZhbHVlTGlzdC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfa2V5RXF1YWxzVmFsdWVMaXN0Ll9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChycGFyZW4gIT0gbnVsbCkgeworCQkJX3JwYXJlbiA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKHJwYXJlbik7CisJCQlpZiAoX3JwYXJlbi5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfcnBhcmVuLl9wYXJlbnQgPSB0aGlzOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9Bbm5vdGF0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9Bbm5vdGF0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDUxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0Fubm90YXRpb25zLmphdmEKQEAgLTAsMCArMSw3MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBBbm5vdGF0aW9ucyBleHRlbmRzIEVtZmF0aWNBU1ROb2RlIHsKKworCXByaXZhdGUgQXJyYXlMaXN0IF9jaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlyZXR1cm4gX2NoaWxkcmVuLnNpemUoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCXJldHVybiAoQVNUTm9kZSlfY2hpbGRyZW4uZ2V0KGluZGV4KTsKKwl9CisKKwkvKioKKwkgKiBBZGQgYSBjaGlsZCB0byB0aGlzIGxpc3QuCisJICovCisJcHVibGljIHZvaWQgYWRkQ2hpbGQoRW1mYXRpY0FTVE5vZGUgY2hpbGQpIHsKKwkJaWYgKGNoaWxkID09IG51bGwpIHJldHVybjsKKwkJaWYgKGNoaWxkLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJX2NoaWxkcmVuLmFkZChjaGlsZCk7CisJCWNoaWxkLl9wYXJlbnQgPSB0aGlzOworCX0KKworCS8qKgorCSAqIFdyYXAgdGhlIHByb3ZpZGVkIFRva2VuIGluIGEgRW1mYXRpY1Rva2VuTm9kZQorCSAqIGFuZCBhZGQgaXQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUuCisJICogCisJICogQHBhcmFtIHRva2VuIHRoZSBUb2tlbiB0byBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZQorCSAqLworCXB1YmxpYyB2b2lkIGFkZENoaWxkKFRva2VuSW5mbyB0b2tlbkluZm8pIHsKKwkJYWRkQ2hpbGQobmV3IEVtZmF0aWNUb2tlbk5vZGUodG9rZW5JbmZvKSk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IEFubm90YXRpb25zLgorCSAqLworCXB1YmxpYyBBbm5vdGF0aW9ucygpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9BdHRyaWJ1dGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiMTc5NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgZXh0ZW5kcyBDbGFzc01lbWJlckRlY2wgIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtXX0FUVFIgPSAiYXR0ciI7CisKKwlwcml2YXRlIEFubm90YXRpb25zIF9hbm5vdGF0aW9uczsKKwlwcml2YXRlIE1vZGlmaWVycyBfbW9kaWZpZXJzOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfYXR0cl9LVzsKKwlwcml2YXRlIFR5cGVXaXRoTXVsdGkgX3R5cGVXaXRoTXVsdGk7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9uYW1lOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfZXF1YWxzOworCXByaXZhdGUgRGVmYXVsdFZhbHVlRXhwciBfZGVmYXVsdFZhbHVlRXhwcjsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX3NlbWk7CisKKwlwdWJsaWMgQW5ub3RhdGlvbnMgZ2V0QW5ub3RhdGlvbnMoKSB7CisJCXJldHVybiBfYW5ub3RhdGlvbnM7CisJfQorCXB1YmxpYyBNb2RpZmllcnMgZ2V0TW9kaWZpZXJzKCkgeworCQlyZXR1cm4gX21vZGlmaWVyczsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0QXR0cl9LVygpIHsKKwkJcmV0dXJuIF9hdHRyX0tXOworCX0KKwlwdWJsaWMgVHlwZVdpdGhNdWx0aSBnZXRUeXBlV2l0aE11bHRpKCkgeworCQlyZXR1cm4gX3R5cGVXaXRoTXVsdGk7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldE5hbWUoKSB7CisJCXJldHVybiBfbmFtZTsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0RXF1YWxzKCkgeworCQlyZXR1cm4gX2VxdWFsczsKKwl9CisJcHVibGljIERlZmF1bHRWYWx1ZUV4cHIgZ2V0RGVmYXVsdFZhbHVlRXhwcigpIHsKKwkJcmV0dXJuIF9kZWZhdWx0VmFsdWVFeHByOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRTZW1pKCkgeworCQlyZXR1cm4gX3NlbWk7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX2Fubm90YXRpb25zICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfbW9kaWZpZXJzICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfYXR0cl9LVyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX3R5cGVXaXRoTXVsdGkgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9uYW1lICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfZXF1YWxzICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfZGVmYXVsdFZhbHVlRXhwciAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX3NlbWkgIT0gbnVsbCkgY291bnQrKzsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlpbnQgY291bnQgPSAtMTsKKwkJaWYgKChfYW5ub3RhdGlvbnMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2Fubm90YXRpb25zOworCQlpZiAoKF9tb2RpZmllcnMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX21vZGlmaWVyczsKKwkJaWYgKChfYXR0cl9LVyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfYXR0cl9LVzsKKwkJaWYgKChfdHlwZVdpdGhNdWx0aSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfdHlwZVdpdGhNdWx0aTsKKwkJaWYgKChfbmFtZSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfbmFtZTsKKwkJaWYgKChfZXF1YWxzICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9lcXVhbHM7CisJCWlmICgoX2RlZmF1bHRWYWx1ZUV4cHIgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2RlZmF1bHRWYWx1ZUV4cHI7CisJCWlmICgoX3NlbWkgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3NlbWk7CisKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IEF0dHJpYnV0ZS4KKwkgKi8KKwlwdWJsaWMgQXR0cmlidXRlKAorCQlBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucywKKwkJTW9kaWZpZXJzIG1vZGlmaWVycywKKwkJVG9rZW5JbmZvIGF0dHJfS1csCisJCVR5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSwKKwkJVG9rZW5JbmZvIG5hbWUsCisJCVRva2VuSW5mbyBlcXVhbHMsCisJCURlZmF1bHRWYWx1ZUV4cHIgZGVmYXVsdFZhbHVlRXhwciwKKwkJVG9rZW5JbmZvIHNlbWkKKwkpIHsKKwkJc3VwZXIoKTsKKworCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisJCQlpZiAoX2Fubm90YXRpb25zLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9hbm5vdGF0aW9ucy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAobW9kaWZpZXJzICE9IG51bGwpIHsKKwkJCV9tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJCQlpZiAoX21vZGlmaWVycy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfbW9kaWZpZXJzLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChhdHRyX0tXICE9IG51bGwpIHsKKwkJCV9hdHRyX0tXID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoYXR0cl9LVyk7CisJCQlpZiAoX2F0dHJfS1cuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2F0dHJfS1cuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKHR5cGVXaXRoTXVsdGkgIT0gbnVsbCkgeworCQkJX3R5cGVXaXRoTXVsdGkgPSB0eXBlV2l0aE11bHRpOworCQkJaWYgKF90eXBlV2l0aE11bHRpLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV90eXBlV2l0aE11bHRpLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChuYW1lICE9IG51bGwpIHsKKwkJCV9uYW1lID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUobmFtZSk7CisJCQlpZiAoX25hbWUuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX25hbWUuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKGVxdWFscyAhPSBudWxsKSB7CisJCQlfZXF1YWxzID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoZXF1YWxzKTsKKwkJCWlmIChfZXF1YWxzLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9lcXVhbHMuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKGRlZmF1bHRWYWx1ZUV4cHIgIT0gbnVsbCkgeworCQkJX2RlZmF1bHRWYWx1ZUV4cHIgPSBkZWZhdWx0VmFsdWVFeHByOworCQkJaWYgKF9kZWZhdWx0VmFsdWVFeHByLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9kZWZhdWx0VmFsdWVFeHByLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChzZW1pICE9IG51bGwpIHsKKwkJCV9zZW1pID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoc2VtaSk7CisJCQlpZiAoX3NlbWkuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3NlbWkuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0Jvb2xFeHByLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0Jvb2xFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiZjM1MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvQm9vbEV4cHIuamF2YQpAQCAtMCwwICsxLDY5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIEJvb2xFeHByIGV4dGVuZHMgRGVmYXVsdFZhbHVlRXhwciAgeworCisKKwlwcml2YXRlIFRydWVPckZhbHNlIF90cnVlT3JGYWxzZTsKKworCXB1YmxpYyBUcnVlT3JGYWxzZSBnZXRUcnVlT3JGYWxzZSgpIHsKKwkJcmV0dXJuIF90cnVlT3JGYWxzZTsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCWludCBjb3VudCA9IDA7CisJCWlmIChfdHJ1ZU9yRmFsc2UgIT0gbnVsbCkgY291bnQrKzsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlpbnQgY291bnQgPSAtMTsKKwkJaWYgKChfdHJ1ZU9yRmFsc2UgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3RydWVPckZhbHNlOworCisJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBCb29sRXhwci4KKwkgKi8KKwlwdWJsaWMgQm9vbEV4cHIoCisJCVRydWVPckZhbHNlIHRydWVPckZhbHNlCisJKSB7CisJCXN1cGVyKCk7CisKKwkJaWYgKHRydWVPckZhbHNlICE9IG51bGwpIHsKKwkJCV90cnVlT3JGYWxzZSA9IHRydWVPckZhbHNlOworCQkJaWYgKF90cnVlT3JGYWxzZS5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfdHJ1ZU9yRmFsc2UuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0JvdW5kRXhjZXB0V2lsZGNhcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvQm91bmRFeGNlcHRXaWxkY2FyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MDMzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0JvdW5kRXhjZXB0V2lsZGNhcmQuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIEJvdW5kRXhjZXB0V2lsZGNhcmQgZXh0ZW5kcyBUeXBlQXJnICB7CisKKworCXByaXZhdGUgUXVhbGlmaWVkSUQgX3Jhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfbHQ7CisJcHJpdmF0ZSBPbmVPck1vcmVUeXBlQXJncyBfb25lT3JNb3JlVHlwZUFyZ3M7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9ndDsKKworCXB1YmxpYyBRdWFsaWZpZWRJRCBnZXRSYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSgpIHsKKwkJcmV0dXJuIF9yYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZTsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0THQoKSB7CisJCXJldHVybiBfbHQ7CisJfQorCXB1YmxpYyBPbmVPck1vcmVUeXBlQXJncyBnZXRPbmVPck1vcmVUeXBlQXJncygpIHsKKwkJcmV0dXJuIF9vbmVPck1vcmVUeXBlQXJnczsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0R3QoKSB7CisJCXJldHVybiBfZ3Q7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX3Jhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfbHQgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9vbmVPck1vcmVUeXBlQXJncyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX2d0ICE9IG51bGwpIGNvdW50Kys7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJaW50IGNvdW50ID0gLTE7CisJCWlmICgoX3Jhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9yYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZTsKKwkJaWYgKChfbHQgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2x0OworCQlpZiAoKF9vbmVPck1vcmVUeXBlQXJncyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfb25lT3JNb3JlVHlwZUFyZ3M7CisJCWlmICgoX2d0ICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9ndDsKKworCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgQm91bmRFeGNlcHRXaWxkY2FyZC4KKwkgKi8KKwlwdWJsaWMgQm91bmRFeGNlcHRXaWxkY2FyZCgKKwkJUXVhbGlmaWVkSUQgcmF3VE5hbWVPclRWYXJPclBhcmFtemVkVE5hbWUsCisJCVRva2VuSW5mbyBsdCwKKwkJT25lT3JNb3JlVHlwZUFyZ3Mgb25lT3JNb3JlVHlwZUFyZ3MsCisJCVRva2VuSW5mbyBndAorCSkgeworCQlzdXBlcigpOworCisJCWlmIChyYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSAhPSBudWxsKSB7CisJCQlfcmF3VE5hbWVPclRWYXJPclBhcmFtemVkVE5hbWUgPSByYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZTsKKwkJCWlmIChfcmF3VE5hbWVPclRWYXJPclBhcmFtemVkVE5hbWUuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3Jhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChsdCAhPSBudWxsKSB7CisJCQlfbHQgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShsdCk7CisJCQlpZiAoX2x0Ll9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9sdC5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAob25lT3JNb3JlVHlwZUFyZ3MgIT0gbnVsbCkgeworCQkJX29uZU9yTW9yZVR5cGVBcmdzID0gb25lT3JNb3JlVHlwZUFyZ3M7CisJCQlpZiAoX29uZU9yTW9yZVR5cGVBcmdzLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9vbmVPck1vcmVUeXBlQXJncy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoZ3QgIT0gbnVsbCkgeworCQkJX2d0ID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoZ3QpOworCQkJaWYgKF9ndC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfZ3QuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0NoYXJFeHByLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0NoYXJFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE1MjNiMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvQ2hhckV4cHIuamF2YQpAQCAtMCwwICsxLDcwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgQ2hhckV4cHIgZXh0ZW5kcyBEZWZhdWx0VmFsdWVFeHByICB7CisKKworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfY2hhcl9saXRlcmFsOworCisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0Q2hhcl9saXRlcmFsKCkgeworCQlyZXR1cm4gX2NoYXJfbGl0ZXJhbDsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCWludCBjb3VudCA9IDA7CisJCWlmIChfY2hhcl9saXRlcmFsICE9IG51bGwpIGNvdW50Kys7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJaW50IGNvdW50ID0gLTE7CisJCWlmICgoX2NoYXJfbGl0ZXJhbCAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfY2hhcl9saXRlcmFsOworCisJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBDaGFyRXhwci4KKwkgKi8KKwlwdWJsaWMgQ2hhckV4cHIoCisJCVRva2VuSW5mbyBjaGFyX2xpdGVyYWwKKwkpIHsKKwkJc3VwZXIoKTsKKworCQlpZiAoY2hhcl9saXRlcmFsICE9IG51bGwpIHsKKwkJCV9jaGFyX2xpdGVyYWwgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShjaGFyX2xpdGVyYWwpOworCQkJaWYgKF9jaGFyX2xpdGVyYWwuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2NoYXJfbGl0ZXJhbC5fcGFyZW50ID0gdGhpczsKKwkJfQorCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvQ2xhc3NEZWNsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0NsYXNzRGVjbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNTg3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0NsYXNzRGVjbC5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NEZWNsIGV4dGVuZHMgVG9wTGV2ZWxEZWNsICB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLV19FWFRFTkRTID0gImV4dGVuZHMiOworCisJcHJpdmF0ZSBBbm5vdGF0aW9ucyBfYW5ub3RhdGlvbnM7CisJcHJpdmF0ZSBBYnN0cmFjdE1vZGlmaWVyIF9hYnN0cmFjdE1vZGlmaWVyOworCXByaXZhdGUgQ2xhc3NLaW5kIF9jbGFzc0tpbmQ7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9uYW1lOworCXByaXZhdGUgVHlwZVBhcmFtc0luZm8gX3R5cGVQYXJhbXNJbmZvOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfZXh0ZW5kc19LVzsKKwlwcml2YXRlIENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBfc3VwZXJUeXBlczsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX2NvbG9uOworCXByaXZhdGUgQm91bmRFeGNlcHRXaWxkY2FyZCBfaW5zdENsYXNzTmFtZTsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX2xjdXJseTsKKwlwcml2YXRlIENsYXNzTWVtYmVyRGVjbHMgX2NsYXNzTWVtYmVyRGVjbHM7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9yY3VybHk7CisKKwlwdWJsaWMgQW5ub3RhdGlvbnMgZ2V0QW5ub3RhdGlvbnMoKSB7CisJCXJldHVybiBfYW5ub3RhdGlvbnM7CisJfQorCXB1YmxpYyBBYnN0cmFjdE1vZGlmaWVyIGdldEFic3RyYWN0TW9kaWZpZXIoKSB7CisJCXJldHVybiBfYWJzdHJhY3RNb2RpZmllcjsKKwl9CisJcHVibGljIENsYXNzS2luZCBnZXRDbGFzc0tpbmQoKSB7CisJCXJldHVybiBfY2xhc3NLaW5kOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXROYW1lKCkgeworCQlyZXR1cm4gX25hbWU7CisJfQorCXB1YmxpYyBUeXBlUGFyYW1zSW5mbyBnZXRUeXBlUGFyYW1zSW5mbygpIHsKKwkJcmV0dXJuIF90eXBlUGFyYW1zSW5mbzsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0RXh0ZW5kc19LVygpIHsKKwkJcmV0dXJuIF9leHRlbmRzX0tXOworCX0KKwlwdWJsaWMgQ29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkIGdldFN1cGVyVHlwZXMoKSB7CisJCXJldHVybiBfc3VwZXJUeXBlczsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0Q29sb24oKSB7CisJCXJldHVybiBfY29sb247CisJfQorCXB1YmxpYyBCb3VuZEV4Y2VwdFdpbGRjYXJkIGdldEluc3RDbGFzc05hbWUoKSB7CisJCXJldHVybiBfaW5zdENsYXNzTmFtZTsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0TGN1cmx5KCkgeworCQlyZXR1cm4gX2xjdXJseTsKKwl9CisJcHVibGljIENsYXNzTWVtYmVyRGVjbHMgZ2V0Q2xhc3NNZW1iZXJEZWNscygpIHsKKwkJcmV0dXJuIF9jbGFzc01lbWJlckRlY2xzOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRSY3VybHkoKSB7CisJCXJldHVybiBfcmN1cmx5OworCX0KKworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgQVNUTm9kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJaWYgKF9hbm5vdGF0aW9ucyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX2Fic3RyYWN0TW9kaWZpZXIgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9jbGFzc0tpbmQgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9uYW1lICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfdHlwZVBhcmFtc0luZm8gIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9leHRlbmRzX0tXICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfc3VwZXJUeXBlcyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX2NvbG9uICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfaW5zdENsYXNzTmFtZSAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX2xjdXJseSAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX2NsYXNzTWVtYmVyRGVjbHMgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9yY3VybHkgIT0gbnVsbCkgY291bnQrKzsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlpbnQgY291bnQgPSAtMTsKKwkJaWYgKChfYW5ub3RhdGlvbnMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2Fubm90YXRpb25zOworCQlpZiAoKF9hYnN0cmFjdE1vZGlmaWVyICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9hYnN0cmFjdE1vZGlmaWVyOworCQlpZiAoKF9jbGFzc0tpbmQgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2NsYXNzS2luZDsKKwkJaWYgKChfbmFtZSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfbmFtZTsKKwkJaWYgKChfdHlwZVBhcmFtc0luZm8gIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3R5cGVQYXJhbXNJbmZvOworCQlpZiAoKF9leHRlbmRzX0tXICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9leHRlbmRzX0tXOworCQlpZiAoKF9zdXBlclR5cGVzICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9zdXBlclR5cGVzOworCQlpZiAoKF9jb2xvbiAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfY29sb247CisJCWlmICgoX2luc3RDbGFzc05hbWUgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2luc3RDbGFzc05hbWU7CisJCWlmICgoX2xjdXJseSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfbGN1cmx5OworCQlpZiAoKF9jbGFzc01lbWJlckRlY2xzICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9jbGFzc01lbWJlckRlY2xzOworCQlpZiAoKF9yY3VybHkgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3JjdXJseTsKKworCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgQ2xhc3NEZWNsLgorCSAqLworCXB1YmxpYyBDbGFzc0RlY2woCisJCUFubm90YXRpb25zIGFubm90YXRpb25zLAorCQlBYnN0cmFjdE1vZGlmaWVyIGFic3RyYWN0TW9kaWZpZXIsCisJCUNsYXNzS2luZCBjbGFzc0tpbmQsCisJCVRva2VuSW5mbyBuYW1lLAorCQlUeXBlUGFyYW1zSW5mbyB0eXBlUGFyYW1zSW5mbywKKwkJVG9rZW5JbmZvIGV4dGVuZHNfS1csCisJCUNvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBzdXBlclR5cGVzLAorCQlUb2tlbkluZm8gY29sb24sCisJCUJvdW5kRXhjZXB0V2lsZGNhcmQgaW5zdENsYXNzTmFtZSwKKwkJVG9rZW5JbmZvIGxjdXJseSwKKwkJQ2xhc3NNZW1iZXJEZWNscyBjbGFzc01lbWJlckRlY2xzLAorCQlUb2tlbkluZm8gcmN1cmx5CisJKSB7CisJCXN1cGVyKCk7CisKKwkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCV9hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOworCQkJaWYgKF9hbm5vdGF0aW9ucy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfYW5ub3RhdGlvbnMuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKGFic3RyYWN0TW9kaWZpZXIgIT0gbnVsbCkgeworCQkJX2Fic3RyYWN0TW9kaWZpZXIgPSBhYnN0cmFjdE1vZGlmaWVyOworCQkJaWYgKF9hYnN0cmFjdE1vZGlmaWVyLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9hYnN0cmFjdE1vZGlmaWVyLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChjbGFzc0tpbmQgIT0gbnVsbCkgeworCQkJX2NsYXNzS2luZCA9IGNsYXNzS2luZDsKKwkJCWlmIChfY2xhc3NLaW5kLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9jbGFzc0tpbmQuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKG5hbWUgIT0gbnVsbCkgeworCQkJX25hbWUgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShuYW1lKTsKKwkJCWlmIChfbmFtZS5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfbmFtZS5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAodHlwZVBhcmFtc0luZm8gIT0gbnVsbCkgeworCQkJX3R5cGVQYXJhbXNJbmZvID0gdHlwZVBhcmFtc0luZm87CisJCQlpZiAoX3R5cGVQYXJhbXNJbmZvLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV90eXBlUGFyYW1zSW5mby5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoZXh0ZW5kc19LVyAhPSBudWxsKSB7CisJCQlfZXh0ZW5kc19LVyA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKGV4dGVuZHNfS1cpOworCQkJaWYgKF9leHRlbmRzX0tXLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9leHRlbmRzX0tXLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChzdXBlclR5cGVzICE9IG51bGwpIHsKKwkJCV9zdXBlclR5cGVzID0gc3VwZXJUeXBlczsKKwkJCWlmIChfc3VwZXJUeXBlcy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfc3VwZXJUeXBlcy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoY29sb24gIT0gbnVsbCkgeworCQkJX2NvbG9uID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoY29sb24pOworCQkJaWYgKF9jb2xvbi5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfY29sb24uX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKGluc3RDbGFzc05hbWUgIT0gbnVsbCkgeworCQkJX2luc3RDbGFzc05hbWUgPSBpbnN0Q2xhc3NOYW1lOworCQkJaWYgKF9pbnN0Q2xhc3NOYW1lLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9pbnN0Q2xhc3NOYW1lLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChsY3VybHkgIT0gbnVsbCkgeworCQkJX2xjdXJseSA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKGxjdXJseSk7CisJCQlpZiAoX2xjdXJseS5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfbGN1cmx5Ll9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChjbGFzc01lbWJlckRlY2xzICE9IG51bGwpIHsKKwkJCV9jbGFzc01lbWJlckRlY2xzID0gY2xhc3NNZW1iZXJEZWNsczsKKwkJCWlmIChfY2xhc3NNZW1iZXJEZWNscy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfY2xhc3NNZW1iZXJEZWNscy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAocmN1cmx5ICE9IG51bGwpIHsKKwkJCV9yY3VybHkgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShyY3VybHkpOworCQkJaWYgKF9yY3VybHkuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3JjdXJseS5fcGFyZW50ID0gdGhpczsKKwkJfQorCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvQ2xhc3NLaW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0NsYXNzS2luZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDY5YmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0NsYXNzS2luZC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc0tpbmQgZXh0ZW5kcyBFbWZhdGljVG9rZW5Ob2RlIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtXX0NMQVNTID0gImNsYXNzIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLV19JTlRFUkZBQ0UgPSAiaW50ZXJmYWNlIjsKKworCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBDbGFzc0tpbmQuCisJICovCisJcHVibGljIENsYXNzS2luZChUb2tlbkluZm8gdG9rZW5JbmZvKSB7CisJCXN1cGVyKHRva2VuSW5mbyk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0NsYXNzTWVtYmVyRGVjbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9DbGFzc01lbWJlckRlY2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzViMTZhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9DbGFzc01lbWJlckRlY2wuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc01lbWJlckRlY2wgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSB7CisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IENsYXNzTWVtYmVyRGVjbC4KKwkgKi8KKwlwdWJsaWMgQ2xhc3NNZW1iZXJEZWNsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9DbGFzc01lbWJlckRlY2xzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0NsYXNzTWVtYmVyRGVjbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQwY2JjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9DbGFzc01lbWJlckRlY2xzLmphdmEKQEAgLTAsMCArMSw3MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc01lbWJlckRlY2xzIGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgeworCisJcHJpdmF0ZSBBcnJheUxpc3QgX2NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCXJldHVybiBfY2hpbGRyZW4uc2l6ZSgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChBU1ROb2RlKV9jaGlsZHJlbi5nZXQoaW5kZXgpOworCX0KKworCS8qKgorCSAqIEFkZCBhIGNoaWxkIHRvIHRoaXMgbGlzdC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChFbWZhdGljQVNUTm9kZSBjaGlsZCkgeworCQlpZiAoY2hpbGQgPT0gbnVsbCkgcmV0dXJuOworCQlpZiAoY2hpbGQuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQlfY2hpbGRyZW4uYWRkKGNoaWxkKTsKKwkJY2hpbGQuX3BhcmVudCA9IHRoaXM7CisJfQorCisJLyoqCisJICogV3JhcCB0aGUgcHJvdmlkZWQgVG9rZW4gaW4gYSBFbWZhdGljVG9rZW5Ob2RlCisJICogYW5kIGFkZCBpdCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gdG9rZW4gdGhlIFRva2VuIHRvIGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlCisJICovCisJcHVibGljIHZvaWQgYWRkQ2hpbGQoVG9rZW5JbmZvIHRva2VuSW5mbykgeworCQlhZGRDaGlsZChuZXcgRW1mYXRpY1Rva2VuTm9kZSh0b2tlbkluZm8pKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgQ2xhc3NNZW1iZXJEZWNscy4KKwkgKi8KKwlwdWJsaWMgQ2xhc3NNZW1iZXJEZWNscygpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9Db21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvQ29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmOGExYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvQ29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkLmphdmEKQEAgLTAsMCArMSw3MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSB7CisKKwlwcml2YXRlIEFycmF5TGlzdCBfY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgQVNUTm9kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKwkJcmV0dXJuIF9jaGlsZHJlbi5zaXplKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlyZXR1cm4gKEFTVE5vZGUpX2NoaWxkcmVuLmdldChpbmRleCk7CisJfQorCisJLyoqCisJICogQWRkIGEgY2hpbGQgdG8gdGhpcyBsaXN0LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZENoaWxkKEVtZmF0aWNBU1ROb2RlIGNoaWxkKSB7CisJCWlmIChjaGlsZCA9PSBudWxsKSByZXR1cm47CisJCWlmIChjaGlsZC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCV9jaGlsZHJlbi5hZGQoY2hpbGQpOworCQljaGlsZC5fcGFyZW50ID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBXcmFwIHRoZSBwcm92aWRlZCBUb2tlbiBpbiBhIEVtZmF0aWNUb2tlbk5vZGUKKwkgKiBhbmQgYWRkIGl0IGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlLgorCSAqIAorCSAqIEBwYXJhbSB0b2tlbiB0aGUgVG9rZW4gdG8gYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChUb2tlbkluZm8gdG9rZW5JbmZvKSB7CisJCWFkZENoaWxkKG5ldyBFbWZhdGljVG9rZW5Ob2RlKHRva2VuSW5mbykpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQuCisJICovCisJcHVibGljIENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9Db21wVW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9Db21wVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOWUxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0NvbXBVbml0LmphdmEKQEAgLTAsMCArMSwxNTcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJpY3MudXRpbC5PbmVUb01hbnlNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmljcy51dGlsLk9uZVRvT25lTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLm91dGxpbmUuT3V0bGluZU5vZGU7CisKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgQ29tcFVuaXQgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSAgeworCisJcHJpdmF0ZSBQYWNrYWdlRGVjbCBfcGFja2FnZURlY2w7CisJcHJpdmF0ZSBJbXBvcnRTdG10cyBfaW1wb3J0U3RtdHM7CisJcHJpdmF0ZSBUb3BMZXZlbERlY2xzIF90b3BMZXZlbERlY2xzOworCisJcHVibGljIFBhY2thZ2VEZWNsIGdldFBhY2thZ2VEZWNsKCkgeworCQlyZXR1cm4gX3BhY2thZ2VEZWNsOworCX0KKworCXB1YmxpYyBJbXBvcnRTdG10cyBnZXRJbXBvcnRTdG10cygpIHsKKwkJcmV0dXJuIF9pbXBvcnRTdG10czsKKwl9CisKKwlwdWJsaWMgVG9wTGV2ZWxEZWNscyBnZXRUb3BMZXZlbERlY2xzKCkgeworCQlyZXR1cm4gX3RvcExldmVsRGVjbHM7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX3BhY2thZ2VEZWNsICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfaW1wb3J0U3RtdHMgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF90b3BMZXZlbERlY2xzICE9IG51bGwpIGNvdW50Kys7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJaW50IGNvdW50ID0gLTE7CisJCWlmICgoX3BhY2thZ2VEZWNsICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9wYWNrYWdlRGVjbDsKKwkJaWYgKChfaW1wb3J0U3RtdHMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2ltcG9ydFN0bXRzOworCQlpZiAoKF90b3BMZXZlbERlY2xzICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF90b3BMZXZlbERlY2xzOworCisJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBDb21wVW5pdC4KKwkgKi8KKwlwdWJsaWMgQ29tcFVuaXQoCisJCVBhY2thZ2VEZWNsIHBhY2thZ2VEZWNsLAorCQlJbXBvcnRTdG10cyBpbXBvcnRTdG10cywKKwkJVG9wTGV2ZWxEZWNscyB0b3BMZXZlbERlY2xzCisJKSB7CisJCXN1cGVyKCk7CisKKwkJaWYgKHBhY2thZ2VEZWNsICE9IG51bGwpIHsKKwkJCV9wYWNrYWdlRGVjbCA9IHBhY2thZ2VEZWNsOworCQkJaWYgKF9wYWNrYWdlRGVjbC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfcGFja2FnZURlY2wuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKGltcG9ydFN0bXRzICE9IG51bGwpIHsKKwkJCV9pbXBvcnRTdG10cyA9IGltcG9ydFN0bXRzOworCQkJaWYgKF9pbXBvcnRTdG10cy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfaW1wb3J0U3RtdHMuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKHRvcExldmVsRGVjbHMgIT0gbnVsbCkgeworCQkJX3RvcExldmVsRGVjbHMgPSB0b3BMZXZlbERlY2xzOworCQkJaWYgKF90b3BMZXZlbERlY2xzLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV90b3BMZXZlbERlY2xzLl9wYXJlbnQgPSB0aGlzOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEFTVChFUGFja2FnZSByb290UGFja2FnZSkgeworCQlhc3QgPSByb290UGFja2FnZTsKKwl9CisKKwlwdWJsaWMgRVBhY2thZ2UgZ2V0QVNUKCkgeworCQlyZXR1cm4gYXN0OworCX0KKworCUVQYWNrYWdlIGFzdCA9IG51bGw7CisJLyoqCisJICogVGhlIGNvbnRlbnRzIG9mIHRoZSBtYXAgY3N0Mm91dGxpbmUgYXJlIGFzIGZvbGxvd3M6CisJICogCisJICogCisJICogQXR0cmlidXRlIGF0IC0+IG5ldyBPdXRsaW5lTm9kZShhdC5nZXROYW1lKCksIC4uLgorCSAqIAorCSAqIFJlZmVyZW5jZSBjIC0+IG5ldyBPdXRsaW5lTm9kZShjLmdldE5hbWUoKSwgLi4uCisJICogCisJICogQW5ub3RhdGlvbiBhc3RBbm4gLT4gbmV3IE91dGxpbmVOb2RlKGFzdEFubiwgLi4uCisJICogCisJICoga3YgaW5zdGFuY2VvZiBLZXlFcXVhbHNWYWx1ZSAtPiBuZXcgT3V0bGluZU5vZGUoa3YsIC4uLgorCSAqIAorCSAqIE9wZXJhdGlvbiBvIC0+IG5ldyBPdXRsaW5lTm9kZShvLmdldE5hbWUoKSwgLi4uCisJICogCisJICogVHlwZVBhcmFtIHRwIC0+IG5ldyBPdXRsaW5lTm9kZSh0cCwgLi4uCisJICogCisJICogQm91bmRFeGNlcHRXaWxkY2FyZCBib3VuZCAtPiBuZXcgT3V0bGluZU5vZGUoYm91bmQsIC4uLgorCSAqIAorCSAqIFBhcmFtIHAgLT4gbmV3IE91dGxpbmVOb2RlKHAsIC4uLgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHNldENzdDJPdXRsaW5lKE1hcDxBU1ROb2RlLCBPdXRsaW5lTm9kZT4gY3N0Mm91dGxpbmUpIHsKKwkJdGhpcy5jc3Qyb3V0bGluZSA9IGNzdDJvdXRsaW5lOworCX0KKworCXB1YmxpYyBNYXA8QVNUTm9kZSwgT3V0bGluZU5vZGU+IGdldENzdDJPdXRsaW5lKCkgeworCQlyZXR1cm4gY3N0Mm91dGxpbmU7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWFwcyhPbmVUb09uZU1hcDxBU1ROb2RlLCBFT2JqZWN0PiBjc3REZWNsMkVjb3JlQVNULCBPbmVUb01hbnlNYXA8RU9iamVjdCwgQVNUTm9kZT4gZWNvcmVEZWNsMmNzdFVzZSkgeworCQl0aGlzLmNzdERlY2wyRWNvcmVBU1QgPSBjc3REZWNsMkVjb3JlQVNUOworCQl0aGlzLmVjb3JlRGVjbDJjc3RVc2UgPSBlY29yZURlY2wyY3N0VXNlOworCX0KKworCXByaXZhdGUgT25lVG9PbmVNYXA8QVNUTm9kZSwgRU9iamVjdD4gY3N0RGVjbDJFY29yZUFTVCA9IG51bGw7CisJcHJpdmF0ZSBPbmVUb01hbnlNYXA8RU9iamVjdCwgQVNUTm9kZT4gZWNvcmVEZWNsMmNzdFVzZSA9IG51bGw7CisJcHJpdmF0ZSBNYXA8QVNUTm9kZSwgT3V0bGluZU5vZGU+IGNzdDJvdXRsaW5lID0gbnVsbDsKKworCXB1YmxpYyBPbmVUb09uZU1hcDxBU1ROb2RlLCBFT2JqZWN0PiBnZXRDc3REZWNsMkVjb3JlQVNUKCkgeworCQlyZXR1cm4gY3N0RGVjbDJFY29yZUFTVDsKKwl9CisJCisJcHVibGljIE9uZVRvTWFueU1hcDxFT2JqZWN0LCBBU1ROb2RlPiBnZXRFY29yZURlY2wyQ3N0VXNlKCkgeworCQlyZXR1cm4gZWNvcmVEZWNsMmNzdFVzZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvRGF0YVR5cGVEZWNsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0RhdGFUeXBlRGVjbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MWQzMTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0RhdGFUeXBlRGVjbC5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgRGF0YVR5cGVEZWNsIGV4dGVuZHMgVG9wTGV2ZWxEZWNsICB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLV19EQVRBVFlQRSA9ICJkYXRhdHlwZSI7CisKKwlwcml2YXRlIEFubm90YXRpb25zIF9hbm5vdGF0aW9uczsKKwlwcml2YXRlIFRyYW5zaWVudE1vZGlmaWVyIF90cmFuc2llbnRNb2RpZmllcjsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX2RhdGF0eXBlX0tXOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfbmFtZTsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX2NvbG9uOworCXByaXZhdGUgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgX2luc3RDbGFzc05hbWU7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9zZW1pOworCisJcHVibGljIEFubm90YXRpb25zIGdldEFubm90YXRpb25zKCkgeworCQlyZXR1cm4gX2Fubm90YXRpb25zOworCX0KKwlwdWJsaWMgVHJhbnNpZW50TW9kaWZpZXIgZ2V0VHJhbnNpZW50TW9kaWZpZXIoKSB7CisJCXJldHVybiBfdHJhbnNpZW50TW9kaWZpZXI7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldERhdGF0eXBlX0tXKCkgeworCQlyZXR1cm4gX2RhdGF0eXBlX0tXOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXROYW1lKCkgeworCQlyZXR1cm4gX25hbWU7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldENvbG9uKCkgeworCQlyZXR1cm4gX2NvbG9uOworCX0KKwlwdWJsaWMgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgZ2V0SW5zdENsYXNzTmFtZSgpIHsKKwkJcmV0dXJuIF9pbnN0Q2xhc3NOYW1lOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRTZW1pKCkgeworCQlyZXR1cm4gX3NlbWk7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX2Fubm90YXRpb25zICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfdHJhbnNpZW50TW9kaWZpZXIgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9kYXRhdHlwZV9LVyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX25hbWUgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9jb2xvbiAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX2luc3RDbGFzc05hbWUgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9zZW1pICE9IG51bGwpIGNvdW50Kys7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJaW50IGNvdW50ID0gLTE7CisJCWlmICgoX2Fubm90YXRpb25zICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9hbm5vdGF0aW9uczsKKwkJaWYgKChfdHJhbnNpZW50TW9kaWZpZXIgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3RyYW5zaWVudE1vZGlmaWVyOworCQlpZiAoKF9kYXRhdHlwZV9LVyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfZGF0YXR5cGVfS1c7CisJCWlmICgoX25hbWUgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX25hbWU7CisJCWlmICgoX2NvbG9uICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9jb2xvbjsKKwkJaWYgKChfaW5zdENsYXNzTmFtZSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfaW5zdENsYXNzTmFtZTsKKwkJaWYgKChfc2VtaSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfc2VtaTsKKworCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgRGF0YVR5cGVEZWNsLgorCSAqLworCXB1YmxpYyBEYXRhVHlwZURlY2woCisJCUFubm90YXRpb25zIGFubm90YXRpb25zLAorCQlUcmFuc2llbnRNb2RpZmllciB0cmFuc2llbnRNb2RpZmllciwKKwkJVG9rZW5JbmZvIGRhdGF0eXBlX0tXLAorCQlUb2tlbkluZm8gbmFtZSwKKwkJVG9rZW5JbmZvIGNvbG9uLAorCQlTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBpbnN0Q2xhc3NOYW1lLAorCQlUb2tlbkluZm8gc2VtaQorCSkgeworCQlzdXBlcigpOworCisJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlfYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKwkJCWlmIChfYW5ub3RhdGlvbnMuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2Fubm90YXRpb25zLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmICh0cmFuc2llbnRNb2RpZmllciAhPSBudWxsKSB7CisJCQlfdHJhbnNpZW50TW9kaWZpZXIgPSB0cmFuc2llbnRNb2RpZmllcjsKKwkJCWlmIChfdHJhbnNpZW50TW9kaWZpZXIuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3RyYW5zaWVudE1vZGlmaWVyLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChkYXRhdHlwZV9LVyAhPSBudWxsKSB7CisJCQlfZGF0YXR5cGVfS1cgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShkYXRhdHlwZV9LVyk7CisJCQlpZiAoX2RhdGF0eXBlX0tXLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9kYXRhdHlwZV9LVy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAobmFtZSAhPSBudWxsKSB7CisJCQlfbmFtZSA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKG5hbWUpOworCQkJaWYgKF9uYW1lLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9uYW1lLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChjb2xvbiAhPSBudWxsKSB7CisJCQlfY29sb24gPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShjb2xvbik7CisJCQlpZiAoX2NvbG9uLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9jb2xvbi5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoaW5zdENsYXNzTmFtZSAhPSBudWxsKSB7CisJCQlfaW5zdENsYXNzTmFtZSA9IGluc3RDbGFzc05hbWU7CisJCQlpZiAoX2luc3RDbGFzc05hbWUuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2luc3RDbGFzc05hbWUuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKHNlbWkgIT0gbnVsbCkgeworCQkJX3NlbWkgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShzZW1pKTsKKwkJCWlmIChfc2VtaS5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfc2VtaS5fcGFyZW50ID0gdGhpczsKKwkJfQorCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvRGVmYXVsdFZhbHVlRXhwci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9EZWZhdWx0VmFsdWVFeHByLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4ZjEyNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvRGVmYXVsdFZhbHVlRXhwci5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIERlZmF1bHRWYWx1ZUV4cHIgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSB7CisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IERlZmF1bHRWYWx1ZUV4cHIuCisJICovCisJcHVibGljIERlZmF1bHRWYWx1ZUV4cHIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0VtZmF0aWNBU1ROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0VtZmF0aWNBU1ROb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkOTVjNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvRW1mYXRpY0FTVE5vZGUuamF2YQpAQCAtMCwwICsxLDc4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGVJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICogVGhlIHN1cGVyY2xhc3Mgb2YgYWxsIEFTVE5vZGVzIGZvciBsYW5ndWFnZSBFbWZhdGljLgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEVtZmF0aWNBU1ROb2RlIGV4dGVuZHMgQVNUTm9kZUltcGwgeworCisJcHJvdGVjdGVkIEVtZmF0aWNBU1ROb2RlIF9wYXJlbnQ7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhpcyBBU1ROb2RlIG9yIG51bGwgaWYgdGhpcyBpcyB0aGUgcm9vdCBub2RlIG9mIGEgdHJlZQorCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldFBhcmVudCgpIHsKKwkJcmV0dXJuIF9wYXJlbnQ7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IEVtZmF0aWNBU1ROb2RlLgorCSAqLworCXB1YmxpYyBFbWZhdGljQVNUTm9kZSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgRW1mYXRpY0FTVE5vZGUuCisJICoKKwkgKiBAcGFyYW0gdG9rZW4gYSBUb2tlbiB0byBpbml0aWFsaXplIHRoZSBvZmZzZXQgYW5kIHRleHQgZm9yIHRoaXMgbm9kZS4KKwkgKi8KKwlwdWJsaWMgRW1mYXRpY0FTVE5vZGUoVG9rZW5JbmZvIHRva2VuSW5mbykgeworCQlzdXBlcih0b2tlbkluZm8pOworCX0KKworCS8qKgorCSAqIFRoZSBleHRlcm5hbCBlbnRyeSBwb2ludCB1c2VkIHRvIGluaXRpYXRlIHRoZSB2aXNpdG9yIG9uIHRoaXMgbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gdmlzaXRvciB0aGUgVmlzaXRvciB0byB2aXNpdCB0aGlzIG5vZGUgdHJlZQorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIGFjY2VwdChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQl2aXNpdG9yLnByZVZpc2l0KHRoaXMpOworCQlhY2NlcHRJbXBsKHZpc2l0b3IpOworCQl2aXNpdG9yLnBvc3RWaXNpdCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHdoaWNoIHNob3VsZCBwcm92aWRlIGV4YWN0bHkKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoZSBnZW5lcmljIG5vZGUKKwkgKiBjbGFzcywgYnV0IGluIHRoZSBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvbnMgPGNvZGU+dGhpczwvY29kZT4gd2lsbCByZWZlciB0bworCSAqIHRoZSBzcGVjaWZpYyBzdWJjbGFzcyB0eXBlLiAgVGh1cyB0aGUgY29ycmVjdCBzcGVjaWZpYyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPgorCSAqIGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcyB3aWxsIGJlIGludm9rZWQgZm9yIGVhY2ggc3ViY2xhc3MgYW5kIHRoZQorCSAqIGdlbmVyaWMgbWV0aG9kcyB3aWxsIGJlIGludm9rZWQgZm9yIHN1YmNsYXNzZXMgdGhhdCBkb24ndCBuZWVkIHNwZWNpZmljIHZpc2l0b3IKKwkgKiBiZWhhdmlvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCisJLyoqCisJICogSXRlcmF0ZSB0aHJvdWdoIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgYW5kIGFjY2VwdCB0aGUgdmlzaXRvciBvbiBlYWNoLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHZpc2l0Q2hpbGRyZW4oRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRDaGlsZENvdW50KCk7IGkrKykgeworCQkJQVNUTm9kZSBjaGlsZCA9IGdldENoaWxkKGkpOworCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRW1mYXRpY0FTVE5vZGUpIHsKKwkJCQlFbWZhdGljQVNUTm9kZSBjID0gKEVtZmF0aWNBU1ROb2RlKWNoaWxkOworCQkJCWMuYWNjZXB0KHZpc2l0b3IpOworCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0VtZmF0aWNBU1ROb2RlVmlzaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9FbWZhdGljQVNUTm9kZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjY0MzBhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9FbWZhdGljQVNUTm9kZVZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDE2MjYgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKKy8qKgorICogQSBWaXNpdG9yIHBhdHRlcm4gc3R1YiBpbXBsZW1lbnRhdGlvbiBmb3IgbGFuZ3VhZ2UgRW1mYXRpYy4KKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBFbWZhdGljQVNUTm9kZVZpc2l0b3IgeworCisJLyoqCisJICogVGhlIGV4dGVybmFsIGVudHJ5IHBvaW50IHVzZWQgdG8gcGVyZm9ybSBhIHZpc2l0IGJlZ2lubmluZyBhdCB0aGUgZ2l2ZW4gbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgRW1mYXRpY0FTVE5vZGUgdG8gdmlzaXQKKwkgKi8KKwlwdWJsaWMgZmluYWwgdm9pZCB2aXNpdChFbWZhdGljQVNUTm9kZSBub2RlKSB7CisJCW5vZGUuYWNjZXB0KHRoaXMpOworCX0KKworCS8qKgorCSAqIENhbGxlZCBqdXN0IGJlZm9yZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQuCisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBFbWZhdGljQVNUTm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHByZVZpc2l0KEVtZmF0aWNBU1ROb2RlIG5vZGUpIHsKKwl9CisKKwkvKioKKwkgKiBDYWxsZWQganVzdCBhZnRlciA8Y29kZT5lbmRWaXNpdDwvY29kZT4gZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZSB0aGUgRW1mYXRpY0FTVE5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBwb3N0VmlzaXQoRW1mYXRpY0FTVE5vZGUgbm9kZSkgeworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBnZW5lcmljIG9uZSBjYWxsZWQgZm9yIG5vZGUgdHlwZXMgdGhhdAorCSAqIGRvbid0IHByb3ZpZGUgYSBzcGVjaWZpYyBvdmVybG9hZGVkIGZvcm0gb2YgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4uCisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBub2RlIHRoZSBFbWZhdGljQVNUTm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChFbWZhdGljQVNUTm9kZSBub2RlKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgZ2VuZXJpYyBvbmUgY2FsbGVkIGZvciBub2RlIHR5cGVzIHRoYXQKKwkgKiBkb24ndCBwcm92aWRlIGEgc3BlY2lmaWMgb3ZlcmxvYWRlZCBmb3JtIG9mIDxjb2RlPmVuZFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIG5vZGUgdGhlIEVtZmF0aWNBU1ROb2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoRW1mYXRpY0FTVE5vZGUgbm9kZSkgeworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+RW1mYXRpY1Rva2VuTm9kZTwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHRva2VuTm9kZSB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChFbWZhdGljVG9rZW5Ob2RlIHRva2VuTm9kZSkgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY0FTVE5vZGUpdG9rZW5Ob2RlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5FbWZhdGljVG9rZW5Ob2RlPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gdG9rZW5Ob2RlIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoRW1mYXRpY1Rva2VuTm9kZSB0b2tlbk5vZGUpIHsKKwkJZW5kVmlzaXQoKEVtZmF0aWNBU1ROb2RlKXRva2VuTm9kZSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5Db21wVW5pdDwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGNvbXBVbml0IHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KENvbXBVbml0IGNvbXBVbml0KSB7CisJCXJldHVybiBiZWdpblZpc2l0KChFbWZhdGljQVNUTm9kZSljb21wVW5pdCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+Q29tcFVuaXQ8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBjb21wVW5pdCB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbXBVbml0IGNvbXBVbml0KSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSljb21wVW5pdCk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+UGFja2FnZURlY2w8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBwYWNrYWdlRGVjbCB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChQYWNrYWdlRGVjbCBwYWNrYWdlRGVjbCkgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY0FTVE5vZGUpcGFja2FnZURlY2wpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlBhY2thZ2VEZWNsPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gcGFja2FnZURlY2wgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChQYWNrYWdlRGVjbCBwYWNrYWdlRGVjbCkgeworCQllbmRWaXNpdCgoRW1mYXRpY0FTVE5vZGUpcGFja2FnZURlY2wpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlF1YWxpZmllZElEPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gcXVhbGlmaWVkSUQgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoUXVhbGlmaWVkSUQgcXVhbGlmaWVkSUQpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKXF1YWxpZmllZElEKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5RdWFsaWZpZWRJRDwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHF1YWxpZmllZElEIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoUXVhbGlmaWVkSUQgcXVhbGlmaWVkSUQpIHsKKwkJZW5kVmlzaXQoKEVtZmF0aWNBU1ROb2RlKXF1YWxpZmllZElEKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5RaWRTZXBhcmF0b3I8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBxaWRTZXBhcmF0b3IgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoUWlkU2VwYXJhdG9yIHFpZFNlcGFyYXRvcikgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY1Rva2VuTm9kZSlxaWRTZXBhcmF0b3IpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlFpZFNlcGFyYXRvcjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHFpZFNlcGFyYXRvciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFFpZFNlcGFyYXRvciBxaWRTZXBhcmF0b3IpIHsKKwkJZW5kVmlzaXQoKEVtZmF0aWNUb2tlbk5vZGUpcWlkU2VwYXJhdG9yKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5TdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRDwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChFbWZhdGljQVNUTm9kZSlzdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+U3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQ8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBzdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSlzdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+U3RyaW5nTGl0ZXJhbENvbnRhaW5lcjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHN0cmluZ0xpdGVyYWxDb250YWluZXIgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoU3RyaW5nTGl0ZXJhbENvbnRhaW5lciBzdHJpbmdMaXRlcmFsQ29udGFpbmVyKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRClzdHJpbmdMaXRlcmFsQ29udGFpbmVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5TdHJpbmdMaXRlcmFsQ29udGFpbmVyPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gc3RyaW5nTGl0ZXJhbENvbnRhaW5lciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN0cmluZ0xpdGVyYWxDb250YWluZXIgc3RyaW5nTGl0ZXJhbENvbnRhaW5lcikgeworCQllbmRWaXNpdCgoU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQpc3RyaW5nTGl0ZXJhbENvbnRhaW5lcik7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+UXVhbGlmaWVkSURDb250YWluZXI8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBxdWFsaWZpZWRJRENvbnRhaW5lciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChRdWFsaWZpZWRJRENvbnRhaW5lciBxdWFsaWZpZWRJRENvbnRhaW5lcikgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQpcXVhbGlmaWVkSURDb250YWluZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlF1YWxpZmllZElEQ29udGFpbmVyPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gcXVhbGlmaWVkSURDb250YWluZXIgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChRdWFsaWZpZWRJRENvbnRhaW5lciBxdWFsaWZpZWRJRENvbnRhaW5lcikgeworCQllbmRWaXNpdCgoU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQpcXVhbGlmaWVkSURDb250YWluZXIpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPkFubm90YXRpb25zPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gYW5ub3RhdGlvbnMgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKWFubm90YXRpb25zKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5Bbm5vdGF0aW9uczwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGFubm90YXRpb25zIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMpIHsKKwkJZW5kVmlzaXQoKEVtZmF0aWNBU1ROb2RlKWFubm90YXRpb25zKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5Bbm5vdGF0aW9uPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKWFubm90YXRpb24pOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPkFubm90YXRpb248L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSlhbm5vdGF0aW9uKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5LZXlFcXVhbHNWYWx1ZUxpc3Q8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBrZXlFcXVhbHNWYWx1ZUxpc3QgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoS2V5RXF1YWxzVmFsdWVMaXN0IGtleUVxdWFsc1ZhbHVlTGlzdCkgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY0FTVE5vZGUpa2V5RXF1YWxzVmFsdWVMaXN0KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5LZXlFcXVhbHNWYWx1ZUxpc3Q8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBrZXlFcXVhbHNWYWx1ZUxpc3QgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChLZXlFcXVhbHNWYWx1ZUxpc3Qga2V5RXF1YWxzVmFsdWVMaXN0KSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSlrZXlFcXVhbHNWYWx1ZUxpc3QpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPktleUVxdWFsc1ZhbHVlPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0ga2V5RXF1YWxzVmFsdWUgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoS2V5RXF1YWxzVmFsdWUga2V5RXF1YWxzVmFsdWUpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKWtleUVxdWFsc1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5LZXlFcXVhbHNWYWx1ZTwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGtleUVxdWFsc1ZhbHVlIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoS2V5RXF1YWxzVmFsdWUga2V5RXF1YWxzVmFsdWUpIHsKKwkJZW5kVmlzaXQoKEVtZmF0aWNBU1ROb2RlKWtleUVxdWFsc1ZhbHVlKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5JbXBvcnRTdG10czwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGltcG9ydFN0bXRzIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KEltcG9ydFN0bXRzIGltcG9ydFN0bXRzKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChFbWZhdGljQVNUTm9kZSlpbXBvcnRTdG10cyk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+SW1wb3J0U3RtdHM8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBpbXBvcnRTdG10cyB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEltcG9ydFN0bXRzIGltcG9ydFN0bXRzKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSlpbXBvcnRTdG10cyk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+SW1wb3J0U3RtdDwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGltcG9ydFN0bXQgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoSW1wb3J0U3RtdCBpbXBvcnRTdG10KSB7CisJCXJldHVybiBiZWdpblZpc2l0KChFbWZhdGljQVNUTm9kZSlpbXBvcnRTdG10KTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5JbXBvcnRTdG10PC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gaW1wb3J0U3RtdCB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEltcG9ydFN0bXQgaW1wb3J0U3RtdCkgeworCQllbmRWaXNpdCgoRW1mYXRpY0FTVE5vZGUpaW1wb3J0U3RtdCk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+VG9wTGV2ZWxEZWNsczwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHRvcExldmVsRGVjbHMgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoVG9wTGV2ZWxEZWNscyB0b3BMZXZlbERlY2xzKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChFbWZhdGljQVNUTm9kZSl0b3BMZXZlbERlY2xzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5Ub3BMZXZlbERlY2xzPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gdG9wTGV2ZWxEZWNscyB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRvcExldmVsRGVjbHMgdG9wTGV2ZWxEZWNscykgeworCQllbmRWaXNpdCgoRW1mYXRpY0FTVE5vZGUpdG9wTGV2ZWxEZWNscyk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+VG9wTGV2ZWxEZWNsPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gdG9wTGV2ZWxEZWNsIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFRvcExldmVsRGVjbCB0b3BMZXZlbERlY2wpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKXRvcExldmVsRGVjbCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+VG9wTGV2ZWxEZWNsPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gdG9wTGV2ZWxEZWNsIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoVG9wTGV2ZWxEZWNsIHRvcExldmVsRGVjbCkgeworCQllbmRWaXNpdCgoRW1mYXRpY0FTVE5vZGUpdG9wTGV2ZWxEZWNsKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5TdWJQYWNrYWdlRGVjbDwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHN1YlBhY2thZ2VEZWNsIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFN1YlBhY2thZ2VEZWNsIHN1YlBhY2thZ2VEZWNsKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChUb3BMZXZlbERlY2wpc3ViUGFja2FnZURlY2wpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlN1YlBhY2thZ2VEZWNsPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gc3ViUGFja2FnZURlY2wgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdWJQYWNrYWdlRGVjbCBzdWJQYWNrYWdlRGVjbCkgeworCQllbmRWaXNpdCgoVG9wTGV2ZWxEZWNsKXN1YlBhY2thZ2VEZWNsKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5DbGFzc0RlY2w8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBjbGFzc0RlY2wgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoQ2xhc3NEZWNsIGNsYXNzRGVjbCkgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoVG9wTGV2ZWxEZWNsKWNsYXNzRGVjbCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+Q2xhc3NEZWNsPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gY2xhc3NEZWNsIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2xhc3NEZWNsIGNsYXNzRGVjbCkgeworCQllbmRWaXNpdCgoVG9wTGV2ZWxEZWNsKWNsYXNzRGVjbCk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+Q29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gY29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBjb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKWNvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+Q29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gY29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoQ29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkIGNvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCkgeworCQllbmRWaXNpdCgoRW1mYXRpY0FTVE5vZGUpY29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5BYnN0cmFjdE1vZGlmaWVyPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gYWJzdHJhY3RNb2RpZmllciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChBYnN0cmFjdE1vZGlmaWVyIGFic3RyYWN0TW9kaWZpZXIpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKWFic3RyYWN0TW9kaWZpZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPkFic3RyYWN0TW9kaWZpZXI8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBhYnN0cmFjdE1vZGlmaWVyIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoQWJzdHJhY3RNb2RpZmllciBhYnN0cmFjdE1vZGlmaWVyKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSlhYnN0cmFjdE1vZGlmaWVyKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5DbGFzc0tpbmQ8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBjbGFzc0tpbmQgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoQ2xhc3NLaW5kIGNsYXNzS2luZCkgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY1Rva2VuTm9kZSljbGFzc0tpbmQpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPkNsYXNzS2luZDwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGNsYXNzS2luZCB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENsYXNzS2luZCBjbGFzc0tpbmQpIHsKKwkJZW5kVmlzaXQoKEVtZmF0aWNUb2tlbk5vZGUpY2xhc3NLaW5kKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5UeXBlUGFyYW1zSW5mbzwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHR5cGVQYXJhbXNJbmZvIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFR5cGVQYXJhbXNJbmZvIHR5cGVQYXJhbXNJbmZvKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChFbWZhdGljQVNUTm9kZSl0eXBlUGFyYW1zSW5mbyk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+VHlwZVBhcmFtc0luZm88L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSB0eXBlUGFyYW1zSW5mbyB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVQYXJhbXNJbmZvIHR5cGVQYXJhbXNJbmZvKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSl0eXBlUGFyYW1zSW5mbyk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+T25lT3JNb3JlVHlwZVBhcmFtczwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIG9uZU9yTW9yZVR5cGVQYXJhbXMgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoT25lT3JNb3JlVHlwZVBhcmFtcyBvbmVPck1vcmVUeXBlUGFyYW1zKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChFbWZhdGljQVNUTm9kZSlvbmVPck1vcmVUeXBlUGFyYW1zKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5PbmVPck1vcmVUeXBlUGFyYW1zPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gb25lT3JNb3JlVHlwZVBhcmFtcyB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE9uZU9yTW9yZVR5cGVQYXJhbXMgb25lT3JNb3JlVHlwZVBhcmFtcykgeworCQllbmRWaXNpdCgoRW1mYXRpY0FTVE5vZGUpb25lT3JNb3JlVHlwZVBhcmFtcyk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+VHlwZVBhcmFtPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZVBhcmFtIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFR5cGVQYXJhbSB0eXBlUGFyYW0pIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKXR5cGVQYXJhbSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+VHlwZVBhcmFtPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZVBhcmFtIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZVBhcmFtIHR5cGVQYXJhbSkgeworCQllbmRWaXNpdCgoRW1mYXRpY0FTVE5vZGUpdHlwZVBhcmFtKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5UeXBlQm91bmRzSW5mbzwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHR5cGVCb3VuZHNJbmZvIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFR5cGVCb3VuZHNJbmZvIHR5cGVCb3VuZHNJbmZvKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChFbWZhdGljQVNUTm9kZSl0eXBlQm91bmRzSW5mbyk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+VHlwZUJvdW5kc0luZm88L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSB0eXBlQm91bmRzSW5mbyB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVCb3VuZHNJbmZvIHR5cGVCb3VuZHNJbmZvKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSl0eXBlQm91bmRzSW5mbyk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+T25lT3JNb3JlVHlwZVBhcmFtQm91bmRzPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KE9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKW9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+T25lT3JNb3JlVHlwZVBhcmFtQm91bmRzPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoT25lT3JNb3JlVHlwZVBhcmFtQm91bmRzIG9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcykgeworCQllbmRWaXNpdCgoRW1mYXRpY0FTVE5vZGUpb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5Cb3VuZEV4Y2VwdFdpbGRjYXJkPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gYm91bmRFeGNlcHRXaWxkY2FyZCB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChCb3VuZEV4Y2VwdFdpbGRjYXJkIGJvdW5kRXhjZXB0V2lsZGNhcmQpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKFR5cGVBcmcpYm91bmRFeGNlcHRXaWxkY2FyZCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+Qm91bmRFeGNlcHRXaWxkY2FyZDwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGJvdW5kRXhjZXB0V2lsZGNhcmQgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChCb3VuZEV4Y2VwdFdpbGRjYXJkIGJvdW5kRXhjZXB0V2lsZGNhcmQpIHsKKwkJZW5kVmlzaXQoKFR5cGVBcmcpYm91bmRFeGNlcHRXaWxkY2FyZCk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+T25lT3JNb3JlVHlwZUFyZ3M8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBvbmVPck1vcmVUeXBlQXJncyB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChPbmVPck1vcmVUeXBlQXJncyBvbmVPck1vcmVUeXBlQXJncykgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY0FTVE5vZGUpb25lT3JNb3JlVHlwZUFyZ3MpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPk9uZU9yTW9yZVR5cGVBcmdzPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gb25lT3JNb3JlVHlwZUFyZ3MgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChPbmVPck1vcmVUeXBlQXJncyBvbmVPck1vcmVUeXBlQXJncykgeworCQllbmRWaXNpdCgoRW1mYXRpY0FTVE5vZGUpb25lT3JNb3JlVHlwZUFyZ3MpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlR5cGVBcmc8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSB0eXBlQXJnIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFR5cGVBcmcgdHlwZUFyZykgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY0FTVE5vZGUpdHlwZUFyZyk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+VHlwZUFyZzwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHR5cGVBcmcgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlQXJnIHR5cGVBcmcpIHsKKwkJZW5kVmlzaXQoKEVtZmF0aWNBU1ROb2RlKXR5cGVBcmcpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPldpbGRjYXJkPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gd2lsZGNhcmQgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoV2lsZGNhcmQgd2lsZGNhcmQpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKFR5cGVBcmcpd2lsZGNhcmQpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPldpbGRjYXJkPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gd2lsZGNhcmQgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChXaWxkY2FyZCB3aWxkY2FyZCkgeworCQllbmRWaXNpdCgoVHlwZUFyZyl3aWxkY2FyZCk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+RXh0ZW5kc09yU3VwZXI8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBleHRlbmRzT3JTdXBlciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChFeHRlbmRzT3JTdXBlciBleHRlbmRzT3JTdXBlcikgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY1Rva2VuTm9kZSlleHRlbmRzT3JTdXBlcik7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+RXh0ZW5kc09yU3VwZXI8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBleHRlbmRzT3JTdXBlciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEV4dGVuZHNPclN1cGVyIGV4dGVuZHNPclN1cGVyKSB7CisJCWVuZFZpc2l0KChFbWZhdGljVG9rZW5Ob2RlKWV4dGVuZHNPclN1cGVyKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5DbGFzc01lbWJlckRlY2xzPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gY2xhc3NNZW1iZXJEZWNscyB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChDbGFzc01lbWJlckRlY2xzIGNsYXNzTWVtYmVyRGVjbHMpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKWNsYXNzTWVtYmVyRGVjbHMpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPkNsYXNzTWVtYmVyRGVjbHM8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBjbGFzc01lbWJlckRlY2xzIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2xhc3NNZW1iZXJEZWNscyBjbGFzc01lbWJlckRlY2xzKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSljbGFzc01lbWJlckRlY2xzKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5DbGFzc01lbWJlckRlY2w8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBjbGFzc01lbWJlckRlY2wgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoQ2xhc3NNZW1iZXJEZWNsIGNsYXNzTWVtYmVyRGVjbCkgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY0FTVE5vZGUpY2xhc3NNZW1iZXJEZWNsKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5DbGFzc01lbWJlckRlY2w8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBjbGFzc01lbWJlckRlY2wgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChDbGFzc01lbWJlckRlY2wgY2xhc3NNZW1iZXJEZWNsKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSljbGFzc01lbWJlckRlY2wpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGF0dHJpYnV0ZSB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChDbGFzc01lbWJlckRlY2wpYXR0cmlidXRlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCWVuZFZpc2l0KChDbGFzc01lbWJlckRlY2wpYXR0cmlidXRlKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5UeXBlV2l0aE11bHRpPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZVdpdGhNdWx0aSB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChUeXBlV2l0aE11bHRpIHR5cGVXaXRoTXVsdGkpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKFJlc3VsdFR5cGUpdHlwZVdpdGhNdWx0aSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+VHlwZVdpdGhNdWx0aTwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHR5cGVXaXRoTXVsdGkgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlV2l0aE11bHRpIHR5cGVXaXRoTXVsdGkpIHsKKwkJZW5kVmlzaXQoKFJlc3VsdFR5cGUpdHlwZVdpdGhNdWx0aSk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+TXVsdGlwbGljaXR5PC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gbXVsdGlwbGljaXR5IHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KE11bHRpcGxpY2l0eSBtdWx0aXBsaWNpdHkpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKW11bHRpcGxpY2l0eSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+TXVsdGlwbGljaXR5PC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gbXVsdGlwbGljaXR5IHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoTXVsdGlwbGljaXR5IG11bHRpcGxpY2l0eSkgeworCQllbmRWaXNpdCgoRW1mYXRpY0FTVE5vZGUpbXVsdGlwbGljaXR5KTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5NdWx0aXBsaWNpdHlFeHByPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gbXVsdGlwbGljaXR5RXhwciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChNdWx0aXBsaWNpdHlFeHByIG11bHRpcGxpY2l0eUV4cHIpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKW11bHRpcGxpY2l0eUV4cHIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPk11bHRpcGxpY2l0eUV4cHI8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBtdWx0aXBsaWNpdHlFeHByIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoTXVsdGlwbGljaXR5RXhwciBtdWx0aXBsaWNpdHlFeHByKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSltdWx0aXBsaWNpdHlFeHByKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5TaW1wbGVNdWx0aXBsaWNpdHlFeHByPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gc2ltcGxlTXVsdGlwbGljaXR5RXhwciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChTaW1wbGVNdWx0aXBsaWNpdHlFeHByIHNpbXBsZU11bHRpcGxpY2l0eUV4cHIpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNUb2tlbk5vZGUpc2ltcGxlTXVsdGlwbGljaXR5RXhwcik7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+U2ltcGxlTXVsdGlwbGljaXR5RXhwcjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHNpbXBsZU11bHRpcGxpY2l0eUV4cHIgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW1wbGVNdWx0aXBsaWNpdHlFeHByIHNpbXBsZU11bHRpcGxpY2l0eUV4cHIpIHsKKwkJZW5kVmlzaXQoKEVtZmF0aWNUb2tlbk5vZGUpc2ltcGxlTXVsdGlwbGljaXR5RXhwcik7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+UmVmZXJlbmNlPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gcmVmZXJlbmNlIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKENsYXNzTWVtYmVyRGVjbClyZWZlcmVuY2UpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlJlZmVyZW5jZTwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHJlZmVyZW5jZSB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJZW5kVmlzaXQoKENsYXNzTWVtYmVyRGVjbClyZWZlcmVuY2UpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlJlZmVyZW5jZUtpbmQ8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSByZWZlcmVuY2VLaW5kIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFJlZmVyZW5jZUtpbmQgcmVmZXJlbmNlS2luZCkgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY1Rva2VuTm9kZSlyZWZlcmVuY2VLaW5kKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5SZWZlcmVuY2VLaW5kPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gcmVmZXJlbmNlS2luZCB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFJlZmVyZW5jZUtpbmQgcmVmZXJlbmNlS2luZCkgeworCQllbmRWaXNpdCgoRW1mYXRpY1Rva2VuTm9kZSlyZWZlcmVuY2VLaW5kKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5Nb2RpZmllcnM8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoTW9kaWZpZXJzIG1vZGlmaWVycykgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY0FTVE5vZGUpbW9kaWZpZXJzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5Nb2RpZmllcnM8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChNb2RpZmllcnMgbW9kaWZpZXJzKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSltb2RpZmllcnMpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPk9wdE5lZ2F0ZWRNb2RpZmllcjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIG9wdE5lZ2F0ZWRNb2RpZmllciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChPcHROZWdhdGVkTW9kaWZpZXIgb3B0TmVnYXRlZE1vZGlmaWVyKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChFbWZhdGljQVNUTm9kZSlvcHROZWdhdGVkTW9kaWZpZXIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPk9wdE5lZ2F0ZWRNb2RpZmllcjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIG9wdE5lZ2F0ZWRNb2RpZmllciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE9wdE5lZ2F0ZWRNb2RpZmllciBvcHROZWdhdGVkTW9kaWZpZXIpIHsKKwkJZW5kVmlzaXQoKEVtZmF0aWNBU1ROb2RlKW9wdE5lZ2F0ZWRNb2RpZmllcik7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+TW9kaWZpZXI8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBtb2RpZmllciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChNb2RpZmllciBtb2RpZmllcikgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY1Rva2VuTm9kZSltb2RpZmllcik7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+TW9kaWZpZXI8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBtb2RpZmllciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1vZGlmaWVyIG1vZGlmaWVyKSB7CisJCWVuZFZpc2l0KChFbWZhdGljVG9rZW5Ob2RlKW1vZGlmaWVyKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5EZWZhdWx0VmFsdWVFeHByPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlRXhwciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChEZWZhdWx0VmFsdWVFeHByIGRlZmF1bHRWYWx1ZUV4cHIpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKWRlZmF1bHRWYWx1ZUV4cHIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPkRlZmF1bHRWYWx1ZUV4cHI8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWVFeHByIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoRGVmYXVsdFZhbHVlRXhwciBkZWZhdWx0VmFsdWVFeHByKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSlkZWZhdWx0VmFsdWVFeHByKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5Cb29sRXhwcjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGJvb2xFeHByIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KEJvb2xFeHByIGJvb2xFeHByKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChEZWZhdWx0VmFsdWVFeHByKWJvb2xFeHByKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5Cb29sRXhwcjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGJvb2xFeHByIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoQm9vbEV4cHIgYm9vbEV4cHIpIHsKKwkJZW5kVmlzaXQoKERlZmF1bHRWYWx1ZUV4cHIpYm9vbEV4cHIpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlRydWVPckZhbHNlPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gdHJ1ZU9yRmFsc2UgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoVHJ1ZU9yRmFsc2UgdHJ1ZU9yRmFsc2UpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNUb2tlbk5vZGUpdHJ1ZU9yRmFsc2UpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlRydWVPckZhbHNlPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gdHJ1ZU9yRmFsc2UgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChUcnVlT3JGYWxzZSB0cnVlT3JGYWxzZSkgeworCQllbmRWaXNpdCgoRW1mYXRpY1Rva2VuTm9kZSl0cnVlT3JGYWxzZSk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+SW50RXhwcjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGludEV4cHIgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoSW50RXhwciBpbnRFeHByKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChEZWZhdWx0VmFsdWVFeHByKWludEV4cHIpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPkludEV4cHI8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBpbnRFeHByIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoSW50RXhwciBpbnRFeHByKSB7CisJCWVuZFZpc2l0KChEZWZhdWx0VmFsdWVFeHByKWludEV4cHIpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlN0cmluZ0V4cHI8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBzdHJpbmdFeHByIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFN0cmluZ0V4cHIgc3RyaW5nRXhwcikgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRGVmYXVsdFZhbHVlRXhwcilzdHJpbmdFeHByKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5TdHJpbmdFeHByPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gc3RyaW5nRXhwciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN0cmluZ0V4cHIgc3RyaW5nRXhwcikgeworCQllbmRWaXNpdCgoRGVmYXVsdFZhbHVlRXhwcilzdHJpbmdFeHByKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5DaGFyRXhwcjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGNoYXJFeHByIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KENoYXJFeHByIGNoYXJFeHByKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChEZWZhdWx0VmFsdWVFeHByKWNoYXJFeHByKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5DaGFyRXhwcjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGNoYXJFeHByIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2hhckV4cHIgY2hhckV4cHIpIHsKKwkJZW5kVmlzaXQoKERlZmF1bHRWYWx1ZUV4cHIpY2hhckV4cHIpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPk9wZXJhdGlvbjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIG9wZXJhdGlvbiB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChPcGVyYXRpb24gb3BlcmF0aW9uKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChDbGFzc01lbWJlckRlY2wpb3BlcmF0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5PcGVyYXRpb248L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBvcGVyYXRpb24gdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChPcGVyYXRpb24gb3BlcmF0aW9uKSB7CisJCWVuZFZpc2l0KChDbGFzc01lbWJlckRlY2wpb3BlcmF0aW9uKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5SZXN1bHRUeXBlPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzdWx0VHlwZSB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChSZXN1bHRUeXBlIHJlc3VsdFR5cGUpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKXJlc3VsdFR5cGUpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlJlc3VsdFR5cGU8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSByZXN1bHRUeXBlIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoUmVzdWx0VHlwZSByZXN1bHRUeXBlKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSlyZXN1bHRUeXBlKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5Wb2lkQ29udGFpbmVyPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gdm9pZENvbnRhaW5lciB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqIEByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGZhbHNlIHRvIHByZXZlbnQgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisJICovCisJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChWb2lkQ29udGFpbmVyIHZvaWRDb250YWluZXIpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKFJlc3VsdFR5cGUpdm9pZENvbnRhaW5lcik7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+Vm9pZENvbnRhaW5lcjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHZvaWRDb250YWluZXIgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChWb2lkQ29udGFpbmVyIHZvaWRDb250YWluZXIpIHsKKwkJZW5kVmlzaXQoKFJlc3VsdFR5cGUpdm9pZENvbnRhaW5lcik7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+UGFyYW1zPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyYW1zIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFBhcmFtcyBwYXJhbXMpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKXBhcmFtcyk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+UGFyYW1zPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyYW1zIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoUGFyYW1zIHBhcmFtcykgeworCQllbmRWaXNpdCgoRW1mYXRpY0FTVE5vZGUpcGFyYW1zKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5QYXJhbTwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHBhcmFtIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFBhcmFtIHBhcmFtKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChFbWZhdGljQVNUTm9kZSlwYXJhbSk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+UGFyYW08L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBwYXJhbSB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhcmFtIHBhcmFtKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSlwYXJhbSk7CisJfQorCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGp1c3QgYWZ0ZXIgPGNvZGU+cHJlVmlzaXQ8L2NvZGU+IGFuZAorCSAqIGJlZm9yZSAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorCSAqIFRoaXMgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+RGF0YVR5cGVEZWNsPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gZGF0YVR5cGVEZWNsIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KERhdGFUeXBlRGVjbCBkYXRhVHlwZURlY2wpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKFRvcExldmVsRGVjbClkYXRhVHlwZURlY2wpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPkRhdGFUeXBlRGVjbDwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGRhdGFUeXBlRGVjbCB0aGUgbm9kZSBjdXJyZW50bHkgYmVpbmcgdmlzaXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGVuZFZpc2l0KERhdGFUeXBlRGVjbCBkYXRhVHlwZURlY2wpIHsKKwkJZW5kVmlzaXQoKFRvcExldmVsRGVjbClkYXRhVHlwZURlY2wpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPlRyYW5zaWVudE1vZGlmaWVyPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gdHJhbnNpZW50TW9kaWZpZXIgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoVHJhbnNpZW50TW9kaWZpZXIgdHJhbnNpZW50TW9kaWZpZXIpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKXRyYW5zaWVudE1vZGlmaWVyKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5UcmFuc2llbnRNb2RpZmllcjwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIHRyYW5zaWVudE1vZGlmaWVyIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoVHJhbnNpZW50TW9kaWZpZXIgdHJhbnNpZW50TW9kaWZpZXIpIHsKKwkJZW5kVmlzaXQoKEVtZmF0aWNBU1ROb2RlKXRyYW5zaWVudE1vZGlmaWVyKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5FbnVtRGVjbDwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGVudW1EZWNsIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICogQHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSwgZmFsc2UgdG8gcHJldmVudCB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KEVudW1EZWNsIGVudW1EZWNsKSB7CisJCXJldHVybiBiZWdpblZpc2l0KChUb3BMZXZlbERlY2wpZW51bURlY2wpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgY2FsbGVkLCBmb3IgZWFjaCBub2RlIGJlaW5nIHZpc2l0ZWQsIGFmdGVyIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZAorCSAqIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUgYW5kIGJlZm9yZSA8Y29kZT5wb3N0VmlzaXQ8L2NvZGU+LgorCSAqIFRoaXMgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPkVudW1EZWNsPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gZW51bURlY2wgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbnVtRGVjbCBlbnVtRGVjbCkgeworCQllbmRWaXNpdCgoVG9wTGV2ZWxEZWNsKWVudW1EZWNsKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5FbnVtTGl0ZXJhbHM8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBlbnVtTGl0ZXJhbHMgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoRW51bUxpdGVyYWxzIGVudW1MaXRlcmFscykgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoRW1mYXRpY0FTVE5vZGUpZW51bUxpdGVyYWxzKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5FbnVtTGl0ZXJhbHM8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBlbnVtTGl0ZXJhbHMgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbnVtTGl0ZXJhbHMgZW51bUxpdGVyYWxzKSB7CisJCWVuZFZpc2l0KChFbWZhdGljQVNUTm9kZSllbnVtTGl0ZXJhbHMpOworCX0KKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBqdXN0IGFmdGVyIDxjb2RlPnByZVZpc2l0PC9jb2RlPiBhbmQKKwkgKiBiZWZvcmUgKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKwkgKiBUaGlzIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IG1ldGhvZCBpcyB0aGUgc3BlY2lmaWMgb25lIGNhbGxlZCBmb3Igbm9kZXMKKwkgKiBvZiB0eXBlIDxjb2RlPkVudW1MaXRlcmFsPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gZW51bUxpdGVyYWwgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoRW51bUxpdGVyYWwgZW51bUxpdGVyYWwpIHsKKwkJcmV0dXJuIGJlZ2luVmlzaXQoKEVtZmF0aWNBU1ROb2RlKWVudW1MaXRlcmFsKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGNhbGxlZCwgZm9yIGVhY2ggbm9kZSBiZWluZyB2aXNpdGVkLCBhZnRlciA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQKKwkgKiAob3B0aW9uYWxseSkgdmlzaXRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFuZCBiZWZvcmUgPGNvZGU+cG9zdFZpc2l0PC9jb2RlPi4KKwkgKiBUaGlzIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5FbnVtTGl0ZXJhbDwvY29kZT4KKwkgKiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIHRvIHByb3ZpZGUgc3BlY2lhbCBiZWhhdmlvciBhdCB0aGF0IHBvaW50IGluIHByb2Nlc3NpbmcuCisJICogCisJICogQHBhcmFtIGVudW1MaXRlcmFsIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoRW51bUxpdGVyYWwgZW51bUxpdGVyYWwpIHsKKwkJZW5kVmlzaXQoKEVtZmF0aWNBU1ROb2RlKWVudW1MaXRlcmFsKTsKKwl9CisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwganVzdCBhZnRlciA8Y29kZT5wcmVWaXNpdDwvY29kZT4gYW5kCisJICogYmVmb3JlIChvcHRpb25hbGx5KSB2aXNpdGluZyB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUuCisJICogVGhpcyA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBtZXRob2QgaXMgdGhlIHNwZWNpZmljIG9uZSBjYWxsZWQgZm9yIG5vZGVzCisJICogb2YgdHlwZSA8Y29kZT5NYXBFbnRyeURlY2w8L2NvZGU+CisJICogVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIHNwZWNpYWwgYmVoYXZpb3IgYXQgdGhhdCBwb2ludCBpbiBwcm9jZXNzaW5nLgorCSAqIAorCSAqIEBwYXJhbSBtYXBFbnRyeURlY2wgdGhlIG5vZGUgY3VycmVudGx5IGJlaW5nIHZpc2l0ZWQKKwkgKiBAcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBmYWxzZSB0byBwcmV2ZW50IHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZQorCSAqLworCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoTWFwRW50cnlEZWNsIG1hcEVudHJ5RGVjbCkgeworCQlyZXR1cm4gYmVnaW5WaXNpdCgoVG9wTGV2ZWxEZWNsKW1hcEVudHJ5RGVjbCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQsIGZvciBlYWNoIG5vZGUgYmVpbmcgdmlzaXRlZCwgYWZ0ZXIgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kCisJICogKG9wdGlvbmFsbHkpIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhbmQgYmVmb3JlIDxjb2RlPnBvc3RWaXNpdDwvY29kZT4uCisJICogVGhpcyA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kIGlzIHRoZSBzcGVjaWZpYyBvbmUgY2FsbGVkIGZvciBub2RlcworCSAqIG9mIHR5cGUgPGNvZGU+TWFwRW50cnlEZWNsPC9jb2RlPgorCSAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBzcGVjaWFsIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgaW4gcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gbWFwRW50cnlEZWNsIHRoZSBub2RlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkCisJICovCisJcHVibGljIHZvaWQgZW5kVmlzaXQoTWFwRW50cnlEZWNsIG1hcEVudHJ5RGVjbCkgeworCQllbmRWaXNpdCgoVG9wTGV2ZWxEZWNsKW1hcEVudHJ5RGVjbCk7CisJfQorCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0VtZmF0aWNUb2tlbk5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvRW1mYXRpY1Rva2VuTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZWI5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0VtZmF0aWNUb2tlbk5vZGUuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgdG9rZW4gaW4gdGhlIGxhbmd1YWdlIGdyYW1tYXIuCisgKiBDYW4gYmUgc3ViY2xhc3NlZCB0byByZXByZXNlbnQgc3BlY2lmaWMgdG9rZW4gc3ViZ3JvdXBzLgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIEVtZmF0aWNUb2tlbk5vZGUgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSB7CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGZpbmFsIGludCBnZXRDaGlsZENvdW50KCkgeworCQkvLyB0b2tlbiBydWxlcyBjYW5ub3QgaGF2ZSBjaGlsZHJlbiEKKwkJcmV0dXJuIDA7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBmaW5hbCBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQkvLyB0b2tlbiBydWxlcyBjYW5ub3QgaGF2ZSBjaGlsZHJlbiEKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgRW1mYXRpY1Rva2VuTm9kZQorCSAqLworCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlKFRva2VuSW5mbyB0b2tlbkluZm8pIHsKKwkJc3VwZXIodG9rZW5JbmZvKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9FbnVtRGVjbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9FbnVtRGVjbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZmFlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0VudW1EZWNsLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBFbnVtRGVjbCBleHRlbmRzIFRvcExldmVsRGVjbCAgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1dfRU5VTSA9ICJlbnVtIjsKKworCXByaXZhdGUgQW5ub3RhdGlvbnMgX2Fubm90YXRpb25zOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfZW51bV9LVzsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX25hbWU7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9sY3VybHk7CisJcHJpdmF0ZSBFbnVtTGl0ZXJhbHMgX2VudW1MaXRlcmFsczsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX3JjdXJseTsKKworCXB1YmxpYyBBbm5vdGF0aW9ucyBnZXRBbm5vdGF0aW9ucygpIHsKKwkJcmV0dXJuIF9hbm5vdGF0aW9uczsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0RW51bV9LVygpIHsKKwkJcmV0dXJuIF9lbnVtX0tXOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXROYW1lKCkgeworCQlyZXR1cm4gX25hbWU7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldExjdXJseSgpIHsKKwkJcmV0dXJuIF9sY3VybHk7CisJfQorCXB1YmxpYyBFbnVtTGl0ZXJhbHMgZ2V0RW51bUxpdGVyYWxzKCkgeworCQlyZXR1cm4gX2VudW1MaXRlcmFsczsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0UmN1cmx5KCkgeworCQlyZXR1cm4gX3JjdXJseTsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCWludCBjb3VudCA9IDA7CisJCWlmIChfYW5ub3RhdGlvbnMgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9lbnVtX0tXICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfbmFtZSAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX2xjdXJseSAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX2VudW1MaXRlcmFscyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX3JjdXJseSAhPSBudWxsKSBjb3VudCsrOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCWludCBjb3VudCA9IC0xOworCQlpZiAoKF9hbm5vdGF0aW9ucyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfYW5ub3RhdGlvbnM7CisJCWlmICgoX2VudW1fS1cgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2VudW1fS1c7CisJCWlmICgoX25hbWUgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX25hbWU7CisJCWlmICgoX2xjdXJseSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfbGN1cmx5OworCQlpZiAoKF9lbnVtTGl0ZXJhbHMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2VudW1MaXRlcmFsczsKKwkJaWYgKChfcmN1cmx5ICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9yY3VybHk7CisKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IEVudW1EZWNsLgorCSAqLworCXB1YmxpYyBFbnVtRGVjbCgKKwkJQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMsCisJCVRva2VuSW5mbyBlbnVtX0tXLAorCQlUb2tlbkluZm8gbmFtZSwKKwkJVG9rZW5JbmZvIGxjdXJseSwKKwkJRW51bUxpdGVyYWxzIGVudW1MaXRlcmFscywKKwkJVG9rZW5JbmZvIHJjdXJseQorCSkgeworCQlzdXBlcigpOworCisJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlfYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKwkJCWlmIChfYW5ub3RhdGlvbnMuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2Fubm90YXRpb25zLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChlbnVtX0tXICE9IG51bGwpIHsKKwkJCV9lbnVtX0tXID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoZW51bV9LVyk7CisJCQlpZiAoX2VudW1fS1cuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2VudW1fS1cuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKG5hbWUgIT0gbnVsbCkgeworCQkJX25hbWUgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShuYW1lKTsKKwkJCWlmIChfbmFtZS5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfbmFtZS5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAobGN1cmx5ICE9IG51bGwpIHsKKwkJCV9sY3VybHkgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShsY3VybHkpOworCQkJaWYgKF9sY3VybHkuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2xjdXJseS5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoZW51bUxpdGVyYWxzICE9IG51bGwpIHsKKwkJCV9lbnVtTGl0ZXJhbHMgPSBlbnVtTGl0ZXJhbHM7CisJCQlpZiAoX2VudW1MaXRlcmFscy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfZW51bUxpdGVyYWxzLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChyY3VybHkgIT0gbnVsbCkgeworCQkJX3JjdXJseSA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKHJjdXJseSk7CisJCQlpZiAoX3JjdXJseS5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfcmN1cmx5Ll9wYXJlbnQgPSB0aGlzOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9FbnVtTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9FbnVtTGl0ZXJhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNTNjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0VudW1MaXRlcmFsLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBFbnVtTGl0ZXJhbCBleHRlbmRzIEVtZmF0aWNBU1ROb2RlICB7CisKKworCXByaXZhdGUgQW5ub3RhdGlvbnMgX2xlYWRpbmdBbm5vdGF0aW9uczsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX25hbWU7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9lcXVhbHM7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF92YWw7CisJcHJpdmF0ZSBBbm5vdGF0aW9ucyBfdHJhaWxpbmdBbm5vdGF0aW9uczsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX3NlbWk7CisKKwlwdWJsaWMgQW5ub3RhdGlvbnMgZ2V0TGVhZGluZ0Fubm90YXRpb25zKCkgeworCQlyZXR1cm4gX2xlYWRpbmdBbm5vdGF0aW9uczsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIF9uYW1lOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRFcXVhbHMoKSB7CisJCXJldHVybiBfZXF1YWxzOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRWYWwoKSB7CisJCXJldHVybiBfdmFsOworCX0KKwlwdWJsaWMgQW5ub3RhdGlvbnMgZ2V0VHJhaWxpbmdBbm5vdGF0aW9ucygpIHsKKwkJcmV0dXJuIF90cmFpbGluZ0Fubm90YXRpb25zOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRTZW1pKCkgeworCQlyZXR1cm4gX3NlbWk7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX2xlYWRpbmdBbm5vdGF0aW9ucyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX25hbWUgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9lcXVhbHMgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF92YWwgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF90cmFpbGluZ0Fubm90YXRpb25zICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfc2VtaSAhPSBudWxsKSBjb3VudCsrOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCWludCBjb3VudCA9IC0xOworCQlpZiAoKF9sZWFkaW5nQW5ub3RhdGlvbnMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2xlYWRpbmdBbm5vdGF0aW9uczsKKwkJaWYgKChfbmFtZSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfbmFtZTsKKwkJaWYgKChfZXF1YWxzICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9lcXVhbHM7CisJCWlmICgoX3ZhbCAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfdmFsOworCQlpZiAoKF90cmFpbGluZ0Fubm90YXRpb25zICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF90cmFpbGluZ0Fubm90YXRpb25zOworCQlpZiAoKF9zZW1pICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9zZW1pOworCisJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBFbnVtTGl0ZXJhbC4KKwkgKi8KKwlwdWJsaWMgRW51bUxpdGVyYWwoCisJCUFubm90YXRpb25zIGxlYWRpbmdBbm5vdGF0aW9ucywKKwkJVG9rZW5JbmZvIG5hbWUsCisJCVRva2VuSW5mbyBlcXVhbHMsCisJCVRva2VuSW5mbyB2YWwsCisJCUFubm90YXRpb25zIHRyYWlsaW5nQW5ub3RhdGlvbnMsCisJCVRva2VuSW5mbyBzZW1pCisJKSB7CisJCXN1cGVyKCk7CisKKwkJaWYgKGxlYWRpbmdBbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlfbGVhZGluZ0Fubm90YXRpb25zID0gbGVhZGluZ0Fubm90YXRpb25zOworCQkJaWYgKF9sZWFkaW5nQW5ub3RhdGlvbnMuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2xlYWRpbmdBbm5vdGF0aW9ucy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAobmFtZSAhPSBudWxsKSB7CisJCQlfbmFtZSA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKG5hbWUpOworCQkJaWYgKF9uYW1lLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9uYW1lLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChlcXVhbHMgIT0gbnVsbCkgeworCQkJX2VxdWFscyA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKGVxdWFscyk7CisJCQlpZiAoX2VxdWFscy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfZXF1YWxzLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmICh2YWwgIT0gbnVsbCkgeworCQkJX3ZhbCA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKHZhbCk7CisJCQlpZiAoX3ZhbC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfdmFsLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmICh0cmFpbGluZ0Fubm90YXRpb25zICE9IG51bGwpIHsKKwkJCV90cmFpbGluZ0Fubm90YXRpb25zID0gdHJhaWxpbmdBbm5vdGF0aW9uczsKKwkJCWlmIChfdHJhaWxpbmdBbm5vdGF0aW9ucy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfdHJhaWxpbmdBbm5vdGF0aW9ucy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoc2VtaSAhPSBudWxsKSB7CisJCQlfc2VtaSA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKHNlbWkpOworCQkJaWYgKF9zZW1pLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9zZW1pLl9wYXJlbnQgPSB0aGlzOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9FbnVtTGl0ZXJhbHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvRW51bUxpdGVyYWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1Zjk1YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvRW51bUxpdGVyYWxzLmphdmEKQEAgLTAsMCArMSw3MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBFbnVtTGl0ZXJhbHMgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSB7CisKKwlwcml2YXRlIEFycmF5TGlzdCBfY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgQVNUTm9kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKwkJcmV0dXJuIF9jaGlsZHJlbi5zaXplKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlyZXR1cm4gKEFTVE5vZGUpX2NoaWxkcmVuLmdldChpbmRleCk7CisJfQorCisJLyoqCisJICogQWRkIGEgY2hpbGQgdG8gdGhpcyBsaXN0LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZENoaWxkKEVtZmF0aWNBU1ROb2RlIGNoaWxkKSB7CisJCWlmIChjaGlsZCA9PSBudWxsKSByZXR1cm47CisJCWlmIChjaGlsZC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCV9jaGlsZHJlbi5hZGQoY2hpbGQpOworCQljaGlsZC5fcGFyZW50ID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBXcmFwIHRoZSBwcm92aWRlZCBUb2tlbiBpbiBhIEVtZmF0aWNUb2tlbk5vZGUKKwkgKiBhbmQgYWRkIGl0IGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlLgorCSAqIAorCSAqIEBwYXJhbSB0b2tlbiB0aGUgVG9rZW4gdG8gYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChUb2tlbkluZm8gdG9rZW5JbmZvKSB7CisJCWFkZENoaWxkKG5ldyBFbWZhdGljVG9rZW5Ob2RlKHRva2VuSW5mbykpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBFbnVtTGl0ZXJhbHMuCisJICovCisJcHVibGljIEVudW1MaXRlcmFscygpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9FeHRlbmRzT3JTdXBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9FeHRlbmRzT3JTdXBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODE5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0V4dGVuZHNPclN1cGVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIEV4dGVuZHNPclN1cGVyIGV4dGVuZHMgRW1mYXRpY1Rva2VuTm9kZSB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLV19FWFRFTkRTID0gImV4dGVuZHMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtXX1NVUEVSID0gInN1cGVyIjsKKworCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBFeHRlbmRzT3JTdXBlci4KKwkgKi8KKwlwdWJsaWMgRXh0ZW5kc09yU3VwZXIoVG9rZW5JbmZvIHRva2VuSW5mbykgeworCQlzdXBlcih0b2tlbkluZm8pOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9JbXBvcnRTdG10LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0ltcG9ydFN0bXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTc4OWU0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9JbXBvcnRTdG10LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBJbXBvcnRTdG10IGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtXX0lNUE9SVCA9ICJpbXBvcnQiOworCisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9pbXBvcnRfS1c7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9hbGlhczsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX2VxdWFsczsKKwlwcml2YXRlIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIF91cmk7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9zZW1pOworCisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0SW1wb3J0X0tXKCkgeworCQlyZXR1cm4gX2ltcG9ydF9LVzsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0QWxpYXMoKSB7CisJCXJldHVybiBfYWxpYXM7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldEVxdWFscygpIHsKKwkJcmV0dXJuIF9lcXVhbHM7CisJfQorCXB1YmxpYyBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBnZXRVcmkoKSB7CisJCXJldHVybiBfdXJpOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRTZW1pKCkgeworCQlyZXR1cm4gX3NlbWk7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX2ltcG9ydF9LVyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX2FsaWFzICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfZXF1YWxzICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfdXJpICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfc2VtaSAhPSBudWxsKSBjb3VudCsrOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCWludCBjb3VudCA9IC0xOworCQlpZiAoKF9pbXBvcnRfS1cgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2ltcG9ydF9LVzsKKwkJaWYgKChfYWxpYXMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2FsaWFzOworCQlpZiAoKF9lcXVhbHMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2VxdWFsczsKKwkJaWYgKChfdXJpICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF91cmk7CisJCWlmICgoX3NlbWkgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3NlbWk7CisKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IEltcG9ydFN0bXQuCisJICovCisJcHVibGljIEltcG9ydFN0bXQoCisJCVRva2VuSW5mbyBpbXBvcnRfS1csCisJCVRva2VuSW5mbyBhbGlhcywKKwkJVG9rZW5JbmZvIGVxdWFscywKKwkJU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgdXJpLAorCQlUb2tlbkluZm8gc2VtaQorCSkgeworCQlzdXBlcigpOworCisJCWlmIChpbXBvcnRfS1cgIT0gbnVsbCkgeworCQkJX2ltcG9ydF9LVyA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKGltcG9ydF9LVyk7CisJCQlpZiAoX2ltcG9ydF9LVy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfaW1wb3J0X0tXLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChhbGlhcyAhPSBudWxsKSB7CisJCQlfYWxpYXMgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShhbGlhcyk7CisJCQlpZiAoX2FsaWFzLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9hbGlhcy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoZXF1YWxzICE9IG51bGwpIHsKKwkJCV9lcXVhbHMgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShlcXVhbHMpOworCQkJaWYgKF9lcXVhbHMuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2VxdWFscy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAodXJpICE9IG51bGwpIHsKKwkJCV91cmkgPSB1cmk7CisJCQlpZiAoX3VyaS5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfdXJpLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChzZW1pICE9IG51bGwpIHsKKwkJCV9zZW1pID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoc2VtaSk7CisJCQlpZiAoX3NlbWkuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3NlbWkuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0ltcG9ydFN0bXRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0ltcG9ydFN0bXRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2NDYzYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvSW1wb3J0U3RtdHMuamF2YQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIEltcG9ydFN0bXRzIGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgeworCisJcHJpdmF0ZSBBcnJheUxpc3QgX2NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCXJldHVybiBfY2hpbGRyZW4uc2l6ZSgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChBU1ROb2RlKV9jaGlsZHJlbi5nZXQoaW5kZXgpOworCX0KKworCS8qKgorCSAqIEFkZCBhIGNoaWxkIHRvIHRoaXMgbGlzdC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChFbWZhdGljQVNUTm9kZSBjaGlsZCkgeworCQlpZiAoY2hpbGQgPT0gbnVsbCkgcmV0dXJuOworCQlpZiAoY2hpbGQuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQlfY2hpbGRyZW4uYWRkKGNoaWxkKTsKKwkJY2hpbGQuX3BhcmVudCA9IHRoaXM7CisJfQorCisJLyoqCisJICogV3JhcCB0aGUgcHJvdmlkZWQgVG9rZW4gaW4gYSBFbWZhdGljVG9rZW5Ob2RlCisJICogYW5kIGFkZCBpdCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gdG9rZW4gdGhlIFRva2VuIHRvIGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlCisJICovCisJcHVibGljIHZvaWQgYWRkQ2hpbGQoVG9rZW5JbmZvIHRva2VuSW5mbykgeworCQlhZGRDaGlsZChuZXcgRW1mYXRpY1Rva2VuTm9kZSh0b2tlbkluZm8pKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgSW1wb3J0U3RtdHMuCisJICovCisJcHVibGljIEltcG9ydFN0bXRzKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0ludEV4cHIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvSW50RXhwci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYWE0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0ludEV4cHIuamF2YQpAQCAtMCwwICsxLDgyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgSW50RXhwciBleHRlbmRzIERlZmF1bHRWYWx1ZUV4cHIgIHsKKworCisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9taW51czsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX2ludF9saXRlcmFsOworCisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0TWludXMoKSB7CisJCXJldHVybiBfbWludXM7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldEludF9saXRlcmFsKCkgeworCQlyZXR1cm4gX2ludF9saXRlcmFsOworCX0KKworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgQVNUTm9kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJaWYgKF9taW51cyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX2ludF9saXRlcmFsICE9IG51bGwpIGNvdW50Kys7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJaW50IGNvdW50ID0gLTE7CisJCWlmICgoX21pbnVzICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9taW51czsKKwkJaWYgKChfaW50X2xpdGVyYWwgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2ludF9saXRlcmFsOworCisJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBJbnRFeHByLgorCSAqLworCXB1YmxpYyBJbnRFeHByKAorCQlUb2tlbkluZm8gbWludXMsCisJCVRva2VuSW5mbyBpbnRfbGl0ZXJhbAorCSkgeworCQlzdXBlcigpOworCisJCWlmIChtaW51cyAhPSBudWxsKSB7CisJCQlfbWludXMgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShtaW51cyk7CisJCQlpZiAoX21pbnVzLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9taW51cy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoaW50X2xpdGVyYWwgIT0gbnVsbCkgeworCQkJX2ludF9saXRlcmFsID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoaW50X2xpdGVyYWwpOworCQkJaWYgKF9pbnRfbGl0ZXJhbC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfaW50X2xpdGVyYWwuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0tleUVxdWFsc1ZhbHVlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0tleUVxdWFsc1ZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwNTA1YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvS2V5RXF1YWxzVmFsdWUuamF2YQpAQCAtMCwwICsxLDk0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgS2V5RXF1YWxzVmFsdWUgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSAgeworCisKKwlwcml2YXRlIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIF9rZXk7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9lcXVhbHM7CisJcHJpdmF0ZSBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBfdmFsdWU7CisKKwlwdWJsaWMgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgZ2V0S2V5KCkgeworCQlyZXR1cm4gX2tleTsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0RXF1YWxzKCkgeworCQlyZXR1cm4gX2VxdWFsczsKKwl9CisJcHVibGljIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIGdldFZhbHVlKCkgeworCQlyZXR1cm4gX3ZhbHVlOworCX0KKworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgQVNUTm9kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJaWYgKF9rZXkgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9lcXVhbHMgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF92YWx1ZSAhPSBudWxsKSBjb3VudCsrOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCWludCBjb3VudCA9IC0xOworCQlpZiAoKF9rZXkgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2tleTsKKwkJaWYgKChfZXF1YWxzICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9lcXVhbHM7CisJCWlmICgoX3ZhbHVlICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF92YWx1ZTsKKworCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgS2V5RXF1YWxzVmFsdWUuCisJICovCisJcHVibGljIEtleUVxdWFsc1ZhbHVlKAorCQlTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBrZXksCisJCVRva2VuSW5mbyBlcXVhbHMsCisJCVN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHZhbHVlCisJKSB7CisJCXN1cGVyKCk7CisKKwkJaWYgKGtleSAhPSBudWxsKSB7CisJCQlfa2V5ID0ga2V5OworCQkJaWYgKF9rZXkuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2tleS5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoZXF1YWxzICE9IG51bGwpIHsKKwkJCV9lcXVhbHMgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShlcXVhbHMpOworCQkJaWYgKF9lcXVhbHMuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2VxdWFscy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJX3ZhbHVlID0gdmFsdWU7CisJCQlpZiAoX3ZhbHVlLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV92YWx1ZS5fcGFyZW50ID0gdGhpczsKKwkJfQorCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvS2V5RXF1YWxzVmFsdWVMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0tleUVxdWFsc1ZhbHVlTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZWU0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L0tleUVxdWFsc1ZhbHVlTGlzdC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgS2V5RXF1YWxzVmFsdWVMaXN0IGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgeworCisJcHJpdmF0ZSBBcnJheUxpc3QgX2NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCXJldHVybiBfY2hpbGRyZW4uc2l6ZSgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChBU1ROb2RlKV9jaGlsZHJlbi5nZXQoaW5kZXgpOworCX0KKworCS8qKgorCSAqIEFkZCBhIGNoaWxkIHRvIHRoaXMgbGlzdC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChFbWZhdGljQVNUTm9kZSBjaGlsZCkgeworCQlpZiAoY2hpbGQgPT0gbnVsbCkgcmV0dXJuOworCQlpZiAoY2hpbGQuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQlfY2hpbGRyZW4uYWRkKGNoaWxkKTsKKwkJY2hpbGQuX3BhcmVudCA9IHRoaXM7CisJfQorCisJLyoqCisJICogV3JhcCB0aGUgcHJvdmlkZWQgVG9rZW4gaW4gYSBFbWZhdGljVG9rZW5Ob2RlCisJICogYW5kIGFkZCBpdCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gdG9rZW4gdGhlIFRva2VuIHRvIGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlCisJICovCisJcHVibGljIHZvaWQgYWRkQ2hpbGQoVG9rZW5JbmZvIHRva2VuSW5mbykgeworCQlhZGRDaGlsZChuZXcgRW1mYXRpY1Rva2VuTm9kZSh0b2tlbkluZm8pKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgS2V5RXF1YWxzVmFsdWVMaXN0LgorCSAqLworCXB1YmxpYyBLZXlFcXVhbHNWYWx1ZUxpc3QoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvTWFwRW50cnlEZWNsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L01hcEVudHJ5RGVjbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2N2ZmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L01hcEVudHJ5RGVjbC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgTWFwRW50cnlEZWNsIGV4dGVuZHMgVG9wTGV2ZWxEZWNsICB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLV19NQVBFTlRSWSA9ICJtYXBlbnRyeSI7CisKKwlwcml2YXRlIEFubm90YXRpb25zIF9hbm5vdGF0aW9uczsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX21hcGVudHJ5X0tXOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfbmFtZTsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX2NvbG9uOworCXByaXZhdGUgVHlwZVdpdGhNdWx0aSBfa2V5OworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfbWludXNfZ3Q7CisJcHJpdmF0ZSBUeXBlV2l0aE11bHRpIF92YWx1ZTsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX3NlbWk7CisKKwlwdWJsaWMgQW5ub3RhdGlvbnMgZ2V0QW5ub3RhdGlvbnMoKSB7CisJCXJldHVybiBfYW5ub3RhdGlvbnM7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldE1hcGVudHJ5X0tXKCkgeworCQlyZXR1cm4gX21hcGVudHJ5X0tXOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXROYW1lKCkgeworCQlyZXR1cm4gX25hbWU7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldENvbG9uKCkgeworCQlyZXR1cm4gX2NvbG9uOworCX0KKwlwdWJsaWMgVHlwZVdpdGhNdWx0aSBnZXRLZXkoKSB7CisJCXJldHVybiBfa2V5OworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRNaW51c19ndCgpIHsKKwkJcmV0dXJuIF9taW51c19ndDsKKwl9CisJcHVibGljIFR5cGVXaXRoTXVsdGkgZ2V0VmFsdWUoKSB7CisJCXJldHVybiBfdmFsdWU7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldFNlbWkoKSB7CisJCXJldHVybiBfc2VtaTsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCWludCBjb3VudCA9IDA7CisJCWlmIChfYW5ub3RhdGlvbnMgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9tYXBlbnRyeV9LVyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX25hbWUgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9jb2xvbiAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX2tleSAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX21pbnVzX2d0ICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfdmFsdWUgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9zZW1pICE9IG51bGwpIGNvdW50Kys7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJaW50IGNvdW50ID0gLTE7CisJCWlmICgoX2Fubm90YXRpb25zICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9hbm5vdGF0aW9uczsKKwkJaWYgKChfbWFwZW50cnlfS1cgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX21hcGVudHJ5X0tXOworCQlpZiAoKF9uYW1lICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9uYW1lOworCQlpZiAoKF9jb2xvbiAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfY29sb247CisJCWlmICgoX2tleSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfa2V5OworCQlpZiAoKF9taW51c19ndCAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfbWludXNfZ3Q7CisJCWlmICgoX3ZhbHVlICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF92YWx1ZTsKKwkJaWYgKChfc2VtaSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfc2VtaTsKKworCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgTWFwRW50cnlEZWNsLgorCSAqLworCXB1YmxpYyBNYXBFbnRyeURlY2woCisJCUFubm90YXRpb25zIGFubm90YXRpb25zLAorCQlUb2tlbkluZm8gbWFwZW50cnlfS1csCisJCVRva2VuSW5mbyBuYW1lLAorCQlUb2tlbkluZm8gY29sb24sCisJCVR5cGVXaXRoTXVsdGkga2V5LAorCQlUb2tlbkluZm8gbWludXNfZ3QsCisJCVR5cGVXaXRoTXVsdGkgdmFsdWUsCisJCVRva2VuSW5mbyBzZW1pCisJKSB7CisJCXN1cGVyKCk7CisKKwkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCV9hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOworCQkJaWYgKF9hbm5vdGF0aW9ucy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfYW5ub3RhdGlvbnMuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKG1hcGVudHJ5X0tXICE9IG51bGwpIHsKKwkJCV9tYXBlbnRyeV9LVyA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKG1hcGVudHJ5X0tXKTsKKwkJCWlmIChfbWFwZW50cnlfS1cuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX21hcGVudHJ5X0tXLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChuYW1lICE9IG51bGwpIHsKKwkJCV9uYW1lID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUobmFtZSk7CisJCQlpZiAoX25hbWUuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX25hbWUuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKGNvbG9uICE9IG51bGwpIHsKKwkJCV9jb2xvbiA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKGNvbG9uKTsKKwkJCWlmIChfY29sb24uX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2NvbG9uLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChrZXkgIT0gbnVsbCkgeworCQkJX2tleSA9IGtleTsKKwkJCWlmIChfa2V5Ll9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9rZXkuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKG1pbnVzX2d0ICE9IG51bGwpIHsKKwkJCV9taW51c19ndCA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKG1pbnVzX2d0KTsKKwkJCWlmIChfbWludXNfZ3QuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX21pbnVzX2d0Ll9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQlfdmFsdWUgPSB2YWx1ZTsKKwkJCWlmIChfdmFsdWUuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3ZhbHVlLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChzZW1pICE9IG51bGwpIHsKKwkJCV9zZW1pID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoc2VtaSk7CisJCQlpZiAoX3NlbWkuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3NlbWkuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L01vZGlmaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L01vZGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwMjliOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvTW9kaWZpZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgTW9kaWZpZXIgZXh0ZW5kcyBFbWZhdGljVG9rZW5Ob2RlIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtXX1JFQURPTkxZID0gInJlYWRvbmx5IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLV19WT0xBVElMRSA9ICJ2b2xhdGlsZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1dfVFJBTlNJRU5UID0gInRyYW5zaWVudCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1dfVU5TRVRUQUJMRSA9ICJ1bnNldHRhYmxlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLV19ERVJJVkVEID0gImRlcml2ZWQiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtXX1VOSVFVRSA9ICJ1bmlxdWUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtXX09SREVSRUQgPSAib3JkZXJlZCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1dfUkVTT0xWRSA9ICJyZXNvbHZlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLV19JRCA9ICJpZCI7CisKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgTW9kaWZpZXIuCisJICovCisJcHVibGljIE1vZGlmaWVyKFRva2VuSW5mbyB0b2tlbkluZm8pIHsKKwkJc3VwZXIodG9rZW5JbmZvKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvTW9kaWZpZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L01vZGlmaWVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZGFiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L01vZGlmaWVycy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgTW9kaWZpZXJzIGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgeworCisJcHJpdmF0ZSBBcnJheUxpc3QgX2NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCXJldHVybiBfY2hpbGRyZW4uc2l6ZSgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChBU1ROb2RlKV9jaGlsZHJlbi5nZXQoaW5kZXgpOworCX0KKworCS8qKgorCSAqIEFkZCBhIGNoaWxkIHRvIHRoaXMgbGlzdC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChFbWZhdGljQVNUTm9kZSBjaGlsZCkgeworCQlpZiAoY2hpbGQgPT0gbnVsbCkgcmV0dXJuOworCQlpZiAoY2hpbGQuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQlfY2hpbGRyZW4uYWRkKGNoaWxkKTsKKwkJY2hpbGQuX3BhcmVudCA9IHRoaXM7CisJfQorCisJLyoqCisJICogV3JhcCB0aGUgcHJvdmlkZWQgVG9rZW4gaW4gYSBFbWZhdGljVG9rZW5Ob2RlCisJICogYW5kIGFkZCBpdCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gdG9rZW4gdGhlIFRva2VuIHRvIGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlCisJICovCisJcHVibGljIHZvaWQgYWRkQ2hpbGQoVG9rZW5JbmZvIHRva2VuSW5mbykgeworCQlhZGRDaGlsZChuZXcgRW1mYXRpY1Rva2VuTm9kZSh0b2tlbkluZm8pKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgTW9kaWZpZXJzLgorCSAqLworCXB1YmxpYyBNb2RpZmllcnMoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvTXVsdGlwbGljaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L011bHRpcGxpY2l0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYWVjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L011bHRpcGxpY2l0eS5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aXBsaWNpdHkgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSAgeworCisKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX2xzcXVhcmU7CisJcHJpdmF0ZSBNdWx0aXBsaWNpdHlFeHByIF9tdWx0aXBsaWNpdHlFeHByOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfcnNxdWFyZTsKKworCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldExzcXVhcmUoKSB7CisJCXJldHVybiBfbHNxdWFyZTsKKwl9CisJcHVibGljIE11bHRpcGxpY2l0eUV4cHIgZ2V0TXVsdGlwbGljaXR5RXhwcigpIHsKKwkJcmV0dXJuIF9tdWx0aXBsaWNpdHlFeHByOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRSc3F1YXJlKCkgeworCQlyZXR1cm4gX3JzcXVhcmU7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX2xzcXVhcmUgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9tdWx0aXBsaWNpdHlFeHByICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfcnNxdWFyZSAhPSBudWxsKSBjb3VudCsrOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCWludCBjb3VudCA9IC0xOworCQlpZiAoKF9sc3F1YXJlICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9sc3F1YXJlOworCQlpZiAoKF9tdWx0aXBsaWNpdHlFeHByICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9tdWx0aXBsaWNpdHlFeHByOworCQlpZiAoKF9yc3F1YXJlICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9yc3F1YXJlOworCisJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBNdWx0aXBsaWNpdHkuCisJICovCisJcHVibGljIE11bHRpcGxpY2l0eSgKKwkJVG9rZW5JbmZvIGxzcXVhcmUsCisJCU11bHRpcGxpY2l0eUV4cHIgbXVsdGlwbGljaXR5RXhwciwKKwkJVG9rZW5JbmZvIHJzcXVhcmUKKwkpIHsKKwkJc3VwZXIoKTsKKworCQlpZiAobHNxdWFyZSAhPSBudWxsKSB7CisJCQlfbHNxdWFyZSA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKGxzcXVhcmUpOworCQkJaWYgKF9sc3F1YXJlLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9sc3F1YXJlLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChtdWx0aXBsaWNpdHlFeHByICE9IG51bGwpIHsKKwkJCV9tdWx0aXBsaWNpdHlFeHByID0gbXVsdGlwbGljaXR5RXhwcjsKKwkJCWlmIChfbXVsdGlwbGljaXR5RXhwci5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfbXVsdGlwbGljaXR5RXhwci5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAocnNxdWFyZSAhPSBudWxsKSB7CisJCQlfcnNxdWFyZSA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKHJzcXVhcmUpOworCQkJaWYgKF9yc3F1YXJlLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9yc3F1YXJlLl9wYXJlbnQgPSB0aGlzOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9NdWx0aXBsaWNpdHlFeHByLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L011bHRpcGxpY2l0eUV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjc0NDc5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9NdWx0aXBsaWNpdHlFeHByLmphdmEKQEAgLTAsMCArMSw5NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIE11bHRpcGxpY2l0eUV4cHIgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSAgeworCisKKwlwcml2YXRlIFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgX2xvd2VyQm91bmQ7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9kb3RfZG90OworCXByaXZhdGUgU2ltcGxlTXVsdGlwbGljaXR5RXhwciBfdXBwZXJCb3VuZDsKKworCXB1YmxpYyBTaW1wbGVNdWx0aXBsaWNpdHlFeHByIGdldExvd2VyQm91bmQoKSB7CisJCXJldHVybiBfbG93ZXJCb3VuZDsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0RG90X2RvdCgpIHsKKwkJcmV0dXJuIF9kb3RfZG90OworCX0KKwlwdWJsaWMgU2ltcGxlTXVsdGlwbGljaXR5RXhwciBnZXRVcHBlckJvdW5kKCkgeworCQlyZXR1cm4gX3VwcGVyQm91bmQ7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX2xvd2VyQm91bmQgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9kb3RfZG90ICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfdXBwZXJCb3VuZCAhPSBudWxsKSBjb3VudCsrOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCWludCBjb3VudCA9IC0xOworCQlpZiAoKF9sb3dlckJvdW5kICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9sb3dlckJvdW5kOworCQlpZiAoKF9kb3RfZG90ICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9kb3RfZG90OworCQlpZiAoKF91cHBlckJvdW5kICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF91cHBlckJvdW5kOworCisJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBNdWx0aXBsaWNpdHlFeHByLgorCSAqLworCXB1YmxpYyBNdWx0aXBsaWNpdHlFeHByKAorCQlTaW1wbGVNdWx0aXBsaWNpdHlFeHByIGxvd2VyQm91bmQsCisJCVRva2VuSW5mbyBkb3RfZG90LAorCQlTaW1wbGVNdWx0aXBsaWNpdHlFeHByIHVwcGVyQm91bmQKKwkpIHsKKwkJc3VwZXIoKTsKKworCQlpZiAobG93ZXJCb3VuZCAhPSBudWxsKSB7CisJCQlfbG93ZXJCb3VuZCA9IGxvd2VyQm91bmQ7CisJCQlpZiAoX2xvd2VyQm91bmQuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2xvd2VyQm91bmQuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKGRvdF9kb3QgIT0gbnVsbCkgeworCQkJX2RvdF9kb3QgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShkb3RfZG90KTsKKwkJCWlmIChfZG90X2RvdC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfZG90X2RvdC5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAodXBwZXJCb3VuZCAhPSBudWxsKSB7CisJCQlfdXBwZXJCb3VuZCA9IHVwcGVyQm91bmQ7CisJCQlpZiAoX3VwcGVyQm91bmQuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3VwcGVyQm91bmQuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L09uZU9yTW9yZVR5cGVBcmdzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L09uZU9yTW9yZVR5cGVBcmdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyMjdkNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvT25lT3JNb3JlVHlwZUFyZ3MuamF2YQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIE9uZU9yTW9yZVR5cGVBcmdzIGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgeworCisJcHJpdmF0ZSBBcnJheUxpc3QgX2NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCXJldHVybiBfY2hpbGRyZW4uc2l6ZSgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChBU1ROb2RlKV9jaGlsZHJlbi5nZXQoaW5kZXgpOworCX0KKworCS8qKgorCSAqIEFkZCBhIGNoaWxkIHRvIHRoaXMgbGlzdC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChFbWZhdGljQVNUTm9kZSBjaGlsZCkgeworCQlpZiAoY2hpbGQgPT0gbnVsbCkgcmV0dXJuOworCQlpZiAoY2hpbGQuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQlfY2hpbGRyZW4uYWRkKGNoaWxkKTsKKwkJY2hpbGQuX3BhcmVudCA9IHRoaXM7CisJfQorCisJLyoqCisJICogV3JhcCB0aGUgcHJvdmlkZWQgVG9rZW4gaW4gYSBFbWZhdGljVG9rZW5Ob2RlCisJICogYW5kIGFkZCBpdCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gdG9rZW4gdGhlIFRva2VuIHRvIGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlCisJICovCisJcHVibGljIHZvaWQgYWRkQ2hpbGQoVG9rZW5JbmZvIHRva2VuSW5mbykgeworCQlhZGRDaGlsZChuZXcgRW1mYXRpY1Rva2VuTm9kZSh0b2tlbkluZm8pKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgT25lT3JNb3JlVHlwZUFyZ3MuCisJICovCisJcHVibGljIE9uZU9yTW9yZVR5cGVBcmdzKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L09uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9PbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTc5NTZiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9PbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMuamF2YQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIE9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyBleHRlbmRzIEVtZmF0aWNBU1ROb2RlIHsKKworCXByaXZhdGUgQXJyYXlMaXN0IF9jaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlyZXR1cm4gX2NoaWxkcmVuLnNpemUoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCXJldHVybiAoQVNUTm9kZSlfY2hpbGRyZW4uZ2V0KGluZGV4KTsKKwl9CisKKwkvKioKKwkgKiBBZGQgYSBjaGlsZCB0byB0aGlzIGxpc3QuCisJICovCisJcHVibGljIHZvaWQgYWRkQ2hpbGQoRW1mYXRpY0FTVE5vZGUgY2hpbGQpIHsKKwkJaWYgKGNoaWxkID09IG51bGwpIHJldHVybjsKKwkJaWYgKGNoaWxkLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJX2NoaWxkcmVuLmFkZChjaGlsZCk7CisJCWNoaWxkLl9wYXJlbnQgPSB0aGlzOworCX0KKworCS8qKgorCSAqIFdyYXAgdGhlIHByb3ZpZGVkIFRva2VuIGluIGEgRW1mYXRpY1Rva2VuTm9kZQorCSAqIGFuZCBhZGQgaXQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUuCisJICogCisJICogQHBhcmFtIHRva2VuIHRoZSBUb2tlbiB0byBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZQorCSAqLworCXB1YmxpYyB2b2lkIGFkZENoaWxkKFRva2VuSW5mbyB0b2tlbkluZm8pIHsKKwkJYWRkQ2hpbGQobmV3IEVtZmF0aWNUb2tlbk5vZGUodG9rZW5JbmZvKSk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IE9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcy4KKwkgKi8KKwlwdWJsaWMgT25lT3JNb3JlVHlwZVBhcmFtQm91bmRzKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L09uZU9yTW9yZVR5cGVQYXJhbXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvT25lT3JNb3JlVHlwZVBhcmFtcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MzdlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L09uZU9yTW9yZVR5cGVQYXJhbXMuamF2YQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIE9uZU9yTW9yZVR5cGVQYXJhbXMgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSB7CisKKwlwcml2YXRlIEFycmF5TGlzdCBfY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgQVNUTm9kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKwkJcmV0dXJuIF9jaGlsZHJlbi5zaXplKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlyZXR1cm4gKEFTVE5vZGUpX2NoaWxkcmVuLmdldChpbmRleCk7CisJfQorCisJLyoqCisJICogQWRkIGEgY2hpbGQgdG8gdGhpcyBsaXN0LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZENoaWxkKEVtZmF0aWNBU1ROb2RlIGNoaWxkKSB7CisJCWlmIChjaGlsZCA9PSBudWxsKSByZXR1cm47CisJCWlmIChjaGlsZC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCV9jaGlsZHJlbi5hZGQoY2hpbGQpOworCQljaGlsZC5fcGFyZW50ID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBXcmFwIHRoZSBwcm92aWRlZCBUb2tlbiBpbiBhIEVtZmF0aWNUb2tlbk5vZGUKKwkgKiBhbmQgYWRkIGl0IGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlLgorCSAqIAorCSAqIEBwYXJhbSB0b2tlbiB0aGUgVG9rZW4gdG8gYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChUb2tlbkluZm8gdG9rZW5JbmZvKSB7CisJCWFkZENoaWxkKG5ldyBFbWZhdGljVG9rZW5Ob2RlKHRva2VuSW5mbykpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBPbmVPck1vcmVUeXBlUGFyYW1zLgorCSAqLworCXB1YmxpYyBPbmVPck1vcmVUeXBlUGFyYW1zKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9PcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2I5NzU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9PcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDIwNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIE9wZXJhdGlvbiBleHRlbmRzIENsYXNzTWVtYmVyRGVjbCAgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1dfT1AgPSAib3AiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtXX1RIUk9XUyA9ICJ0aHJvd3MiOworCisJcHJpdmF0ZSBBbm5vdGF0aW9ucyBfYW5ub3RhdGlvbnM7CisJcHJpdmF0ZSBNb2RpZmllcnMgX21vZGlmaWVyczsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX29wX0tXOworCXByaXZhdGUgVHlwZVBhcmFtc0luZm8gX3R5cGVQYXJhbXNJbmZvOworCXByaXZhdGUgUmVzdWx0VHlwZSBfcmVzVHlwZTsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX25hbWU7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9scGFyZW47CisJcHJpdmF0ZSBQYXJhbXMgX3BhcmFtczsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX3JwYXJlbjsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX3Rocm93c19LVzsKKwlwcml2YXRlIENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBfZXhjZXB0aW9uczsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX3NlbWk7CisKKwlwdWJsaWMgQW5ub3RhdGlvbnMgZ2V0QW5ub3RhdGlvbnMoKSB7CisJCXJldHVybiBfYW5ub3RhdGlvbnM7CisJfQorCXB1YmxpYyBNb2RpZmllcnMgZ2V0TW9kaWZpZXJzKCkgeworCQlyZXR1cm4gX21vZGlmaWVyczsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0T3BfS1coKSB7CisJCXJldHVybiBfb3BfS1c7CisJfQorCXB1YmxpYyBUeXBlUGFyYW1zSW5mbyBnZXRUeXBlUGFyYW1zSW5mbygpIHsKKwkJcmV0dXJuIF90eXBlUGFyYW1zSW5mbzsKKwl9CisJcHVibGljIFJlc3VsdFR5cGUgZ2V0UmVzVHlwZSgpIHsKKwkJcmV0dXJuIF9yZXNUeXBlOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXROYW1lKCkgeworCQlyZXR1cm4gX25hbWU7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldExwYXJlbigpIHsKKwkJcmV0dXJuIF9scGFyZW47CisJfQorCXB1YmxpYyBQYXJhbXMgZ2V0UGFyYW1zKCkgeworCQlyZXR1cm4gX3BhcmFtczsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0UnBhcmVuKCkgeworCQlyZXR1cm4gX3JwYXJlbjsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0VGhyb3dzX0tXKCkgeworCQlyZXR1cm4gX3Rocm93c19LVzsKKwl9CisJcHVibGljIENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBnZXRFeGNlcHRpb25zKCkgeworCQlyZXR1cm4gX2V4Y2VwdGlvbnM7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldFNlbWkoKSB7CisJCXJldHVybiBfc2VtaTsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCWludCBjb3VudCA9IDA7CisJCWlmIChfYW5ub3RhdGlvbnMgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9tb2RpZmllcnMgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9vcF9LVyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX3R5cGVQYXJhbXNJbmZvICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfcmVzVHlwZSAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX25hbWUgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9scGFyZW4gIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9wYXJhbXMgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9ycGFyZW4gIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF90aHJvd3NfS1cgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9leGNlcHRpb25zICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfc2VtaSAhPSBudWxsKSBjb3VudCsrOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCWludCBjb3VudCA9IC0xOworCQlpZiAoKF9hbm5vdGF0aW9ucyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfYW5ub3RhdGlvbnM7CisJCWlmICgoX21vZGlmaWVycyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfbW9kaWZpZXJzOworCQlpZiAoKF9vcF9LVyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfb3BfS1c7CisJCWlmICgoX3R5cGVQYXJhbXNJbmZvICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF90eXBlUGFyYW1zSW5mbzsKKwkJaWYgKChfcmVzVHlwZSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfcmVzVHlwZTsKKwkJaWYgKChfbmFtZSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfbmFtZTsKKwkJaWYgKChfbHBhcmVuICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9scGFyZW47CisJCWlmICgoX3BhcmFtcyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfcGFyYW1zOworCQlpZiAoKF9ycGFyZW4gIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3JwYXJlbjsKKwkJaWYgKChfdGhyb3dzX0tXICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF90aHJvd3NfS1c7CisJCWlmICgoX2V4Y2VwdGlvbnMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2V4Y2VwdGlvbnM7CisJCWlmICgoX3NlbWkgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3NlbWk7CisKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IE9wZXJhdGlvbi4KKwkgKi8KKwlwdWJsaWMgT3BlcmF0aW9uKAorCQlBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucywKKwkJTW9kaWZpZXJzIG1vZGlmaWVycywKKwkJVG9rZW5JbmZvIG9wX0tXLAorCQlUeXBlUGFyYW1zSW5mbyB0eXBlUGFyYW1zSW5mbywKKwkJUmVzdWx0VHlwZSByZXNUeXBlLAorCQlUb2tlbkluZm8gbmFtZSwKKwkJVG9rZW5JbmZvIGxwYXJlbiwKKwkJUGFyYW1zIHBhcmFtcywKKwkJVG9rZW5JbmZvIHJwYXJlbiwKKwkJVG9rZW5JbmZvIHRocm93c19LVywKKwkJQ29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkIGV4Y2VwdGlvbnMsCisJCVRva2VuSW5mbyBzZW1pCisJKSB7CisJCXN1cGVyKCk7CisKKwkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKwkJCV9hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOworCQkJaWYgKF9hbm5vdGF0aW9ucy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfYW5ub3RhdGlvbnMuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKG1vZGlmaWVycyAhPSBudWxsKSB7CisJCQlfbW9kaWZpZXJzID0gbW9kaWZpZXJzOworCQkJaWYgKF9tb2RpZmllcnMuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX21vZGlmaWVycy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAob3BfS1cgIT0gbnVsbCkgeworCQkJX29wX0tXID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUob3BfS1cpOworCQkJaWYgKF9vcF9LVy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfb3BfS1cuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKHR5cGVQYXJhbXNJbmZvICE9IG51bGwpIHsKKwkJCV90eXBlUGFyYW1zSW5mbyA9IHR5cGVQYXJhbXNJbmZvOworCQkJaWYgKF90eXBlUGFyYW1zSW5mby5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfdHlwZVBhcmFtc0luZm8uX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKHJlc1R5cGUgIT0gbnVsbCkgeworCQkJX3Jlc1R5cGUgPSByZXNUeXBlOworCQkJaWYgKF9yZXNUeXBlLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9yZXNUeXBlLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChuYW1lICE9IG51bGwpIHsKKwkJCV9uYW1lID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUobmFtZSk7CisJCQlpZiAoX25hbWUuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX25hbWUuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKGxwYXJlbiAhPSBudWxsKSB7CisJCQlfbHBhcmVuID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUobHBhcmVuKTsKKwkJCWlmIChfbHBhcmVuLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9scGFyZW4uX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKHBhcmFtcyAhPSBudWxsKSB7CisJCQlfcGFyYW1zID0gcGFyYW1zOworCQkJaWYgKF9wYXJhbXMuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3BhcmFtcy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAocnBhcmVuICE9IG51bGwpIHsKKwkJCV9ycGFyZW4gPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShycGFyZW4pOworCQkJaWYgKF9ycGFyZW4uX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3JwYXJlbi5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAodGhyb3dzX0tXICE9IG51bGwpIHsKKwkJCV90aHJvd3NfS1cgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZSh0aHJvd3NfS1cpOworCQkJaWYgKF90aHJvd3NfS1cuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3Rocm93c19LVy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoZXhjZXB0aW9ucyAhPSBudWxsKSB7CisJCQlfZXhjZXB0aW9ucyA9IGV4Y2VwdGlvbnM7CisJCQlpZiAoX2V4Y2VwdGlvbnMuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2V4Y2VwdGlvbnMuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKHNlbWkgIT0gbnVsbCkgeworCQkJX3NlbWkgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShzZW1pKTsKKwkJCWlmIChfc2VtaS5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfc2VtaS5fcGFyZW50ID0gdGhpczsKKwkJfQorCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvT3B0TmVnYXRlZE1vZGlmaWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L09wdE5lZ2F0ZWRNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjUyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L09wdE5lZ2F0ZWRNb2RpZmllci5qYXZhCkBAIC0wLDAgKzEsODIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBPcHROZWdhdGVkTW9kaWZpZXIgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSAgeworCisKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX2Jhbmc7CisJcHJpdmF0ZSBNb2RpZmllciBfbW9kaWZpZXI7CisKKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRCYW5nKCkgeworCQlyZXR1cm4gX2Jhbmc7CisJfQorCXB1YmxpYyBNb2RpZmllciBnZXRNb2RpZmllcigpIHsKKwkJcmV0dXJuIF9tb2RpZmllcjsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCWludCBjb3VudCA9IDA7CisJCWlmIChfYmFuZyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX21vZGlmaWVyICE9IG51bGwpIGNvdW50Kys7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJaW50IGNvdW50ID0gLTE7CisJCWlmICgoX2JhbmcgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2Jhbmc7CisJCWlmICgoX21vZGlmaWVyICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9tb2RpZmllcjsKKworCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgT3B0TmVnYXRlZE1vZGlmaWVyLgorCSAqLworCXB1YmxpYyBPcHROZWdhdGVkTW9kaWZpZXIoCisJCVRva2VuSW5mbyBiYW5nLAorCQlNb2RpZmllciBtb2RpZmllcgorCSkgeworCQlzdXBlcigpOworCisJCWlmIChiYW5nICE9IG51bGwpIHsKKwkJCV9iYW5nID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoYmFuZyk7CisJCQlpZiAoX2JhbmcuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2JhbmcuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKG1vZGlmaWVyICE9IG51bGwpIHsKKwkJCV9tb2RpZmllciA9IG1vZGlmaWVyOworCQkJaWYgKF9tb2RpZmllci5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfbW9kaWZpZXIuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1BhY2thZ2VEZWNsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1BhY2thZ2VEZWNsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzViNTYzNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvUGFja2FnZURlY2wuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIFBhY2thZ2VEZWNsIGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtXX1BBQ0tBR0UgPSAicGFja2FnZSI7CisKKwlwcml2YXRlIEFubm90YXRpb25zIF9hbm5vdGF0aW9uczsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX3BhY2thZ2VfS1c7CisJcHJpdmF0ZSBRdWFsaWZpZWRJRCBfbmFtZTsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX3NlbWk7CisKKwlwdWJsaWMgQW5ub3RhdGlvbnMgZ2V0QW5ub3RhdGlvbnMoKSB7CisJCXJldHVybiBfYW5ub3RhdGlvbnM7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldFBhY2thZ2VfS1coKSB7CisJCXJldHVybiBfcGFja2FnZV9LVzsKKwl9CisJcHVibGljIFF1YWxpZmllZElEIGdldE5hbWUoKSB7CisJCXJldHVybiBfbmFtZTsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0U2VtaSgpIHsKKwkJcmV0dXJuIF9zZW1pOworCX0KKworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgQVNUTm9kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJaWYgKF9hbm5vdGF0aW9ucyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX3BhY2thZ2VfS1cgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9uYW1lICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfc2VtaSAhPSBudWxsKSBjb3VudCsrOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCWludCBjb3VudCA9IC0xOworCQlpZiAoKF9hbm5vdGF0aW9ucyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfYW5ub3RhdGlvbnM7CisJCWlmICgoX3BhY2thZ2VfS1cgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3BhY2thZ2VfS1c7CisJCWlmICgoX25hbWUgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX25hbWU7CisJCWlmICgoX3NlbWkgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3NlbWk7CisKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IFBhY2thZ2VEZWNsLgorCSAqLworCXB1YmxpYyBQYWNrYWdlRGVjbCgKKwkJQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMsCisJCVRva2VuSW5mbyBwYWNrYWdlX0tXLAorCQlRdWFsaWZpZWRJRCBuYW1lLAorCQlUb2tlbkluZm8gc2VtaQorCSkgeworCQlzdXBlcigpOworCisJCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlfYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKwkJCWlmIChfYW5ub3RhdGlvbnMuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2Fubm90YXRpb25zLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChwYWNrYWdlX0tXICE9IG51bGwpIHsKKwkJCV9wYWNrYWdlX0tXID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUocGFja2FnZV9LVyk7CisJCQlpZiAoX3BhY2thZ2VfS1cuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3BhY2thZ2VfS1cuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKG5hbWUgIT0gbnVsbCkgeworCQkJX25hbWUgPSBuYW1lOworCQkJaWYgKF9uYW1lLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9uYW1lLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChzZW1pICE9IG51bGwpIHsKKwkJCV9zZW1pID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoc2VtaSk7CisJCQlpZiAoX3NlbWkuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3NlbWkuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1BhcmFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1BhcmFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmM2ZkYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvUGFyYW0uamF2YQpAQCAtMCwwICsxLDExOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIFBhcmFtIGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgIHsKKworCisJcHJpdmF0ZSBBbm5vdGF0aW9ucyBfbGVhZGluZ0Fubm90YXRpb25zOworCXByaXZhdGUgTW9kaWZpZXJzIF9tb2RpZmllcnM7CisJcHJpdmF0ZSBUeXBlV2l0aE11bHRpIF90eXBlV2l0aE11bHRpOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfbmFtZTsKKwlwcml2YXRlIEFubm90YXRpb25zIF90cmFpbGluZ0Fubm90YXRpb25zOworCisJcHVibGljIEFubm90YXRpb25zIGdldExlYWRpbmdBbm5vdGF0aW9ucygpIHsKKwkJcmV0dXJuIF9sZWFkaW5nQW5ub3RhdGlvbnM7CisJfQorCXB1YmxpYyBNb2RpZmllcnMgZ2V0TW9kaWZpZXJzKCkgeworCQlyZXR1cm4gX21vZGlmaWVyczsKKwl9CisJcHVibGljIFR5cGVXaXRoTXVsdGkgZ2V0VHlwZVdpdGhNdWx0aSgpIHsKKwkJcmV0dXJuIF90eXBlV2l0aE11bHRpOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXROYW1lKCkgeworCQlyZXR1cm4gX25hbWU7CisJfQorCXB1YmxpYyBBbm5vdGF0aW9ucyBnZXRUcmFpbGluZ0Fubm90YXRpb25zKCkgeworCQlyZXR1cm4gX3RyYWlsaW5nQW5ub3RhdGlvbnM7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX2xlYWRpbmdBbm5vdGF0aW9ucyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX21vZGlmaWVycyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX3R5cGVXaXRoTXVsdGkgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9uYW1lICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfdHJhaWxpbmdBbm5vdGF0aW9ucyAhPSBudWxsKSBjb3VudCsrOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCWludCBjb3VudCA9IC0xOworCQlpZiAoKF9sZWFkaW5nQW5ub3RhdGlvbnMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2xlYWRpbmdBbm5vdGF0aW9uczsKKwkJaWYgKChfbW9kaWZpZXJzICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9tb2RpZmllcnM7CisJCWlmICgoX3R5cGVXaXRoTXVsdGkgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3R5cGVXaXRoTXVsdGk7CisJCWlmICgoX25hbWUgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX25hbWU7CisJCWlmICgoX3RyYWlsaW5nQW5ub3RhdGlvbnMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3RyYWlsaW5nQW5ub3RhdGlvbnM7CisKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IFBhcmFtLgorCSAqLworCXB1YmxpYyBQYXJhbSgKKwkJQW5ub3RhdGlvbnMgbGVhZGluZ0Fubm90YXRpb25zLAorCQlNb2RpZmllcnMgbW9kaWZpZXJzLAorCQlUeXBlV2l0aE11bHRpIHR5cGVXaXRoTXVsdGksCisJCVRva2VuSW5mbyBuYW1lLAorCQlBbm5vdGF0aW9ucyB0cmFpbGluZ0Fubm90YXRpb25zCisJKSB7CisJCXN1cGVyKCk7CisKKwkJaWYgKGxlYWRpbmdBbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQlfbGVhZGluZ0Fubm90YXRpb25zID0gbGVhZGluZ0Fubm90YXRpb25zOworCQkJaWYgKF9sZWFkaW5nQW5ub3RhdGlvbnMuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2xlYWRpbmdBbm5vdGF0aW9ucy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAobW9kaWZpZXJzICE9IG51bGwpIHsKKwkJCV9tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJCQlpZiAoX21vZGlmaWVycy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfbW9kaWZpZXJzLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmICh0eXBlV2l0aE11bHRpICE9IG51bGwpIHsKKwkJCV90eXBlV2l0aE11bHRpID0gdHlwZVdpdGhNdWx0aTsKKwkJCWlmIChfdHlwZVdpdGhNdWx0aS5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfdHlwZVdpdGhNdWx0aS5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAobmFtZSAhPSBudWxsKSB7CisJCQlfbmFtZSA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKG5hbWUpOworCQkJaWYgKF9uYW1lLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9uYW1lLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmICh0cmFpbGluZ0Fubm90YXRpb25zICE9IG51bGwpIHsKKwkJCV90cmFpbGluZ0Fubm90YXRpb25zID0gdHJhaWxpbmdBbm5vdGF0aW9uczsKKwkJCWlmIChfdHJhaWxpbmdBbm5vdGF0aW9ucy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfdHJhaWxpbmdBbm5vdGF0aW9ucy5fcGFyZW50ID0gdGhpczsKKwkJfQorCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvUGFyYW1zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1BhcmFtcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2U4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1BhcmFtcy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgUGFyYW1zIGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgeworCisJcHJpdmF0ZSBBcnJheUxpc3QgX2NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCXJldHVybiBfY2hpbGRyZW4uc2l6ZSgpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChBU1ROb2RlKV9jaGlsZHJlbi5nZXQoaW5kZXgpOworCX0KKworCS8qKgorCSAqIEFkZCBhIGNoaWxkIHRvIHRoaXMgbGlzdC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChFbWZhdGljQVNUTm9kZSBjaGlsZCkgeworCQlpZiAoY2hpbGQgPT0gbnVsbCkgcmV0dXJuOworCQlpZiAoY2hpbGQuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQlfY2hpbGRyZW4uYWRkKGNoaWxkKTsKKwkJY2hpbGQuX3BhcmVudCA9IHRoaXM7CisJfQorCisJLyoqCisJICogV3JhcCB0aGUgcHJvdmlkZWQgVG9rZW4gaW4gYSBFbWZhdGljVG9rZW5Ob2RlCisJICogYW5kIGFkZCBpdCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gdG9rZW4gdGhlIFRva2VuIHRvIGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlCisJICovCisJcHVibGljIHZvaWQgYWRkQ2hpbGQoVG9rZW5JbmZvIHRva2VuSW5mbykgeworCQlhZGRDaGlsZChuZXcgRW1mYXRpY1Rva2VuTm9kZSh0b2tlbkluZm8pKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgUGFyYW1zLgorCSAqLworCXB1YmxpYyBQYXJhbXMoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvUWlkU2VwYXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1FpZFNlcGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MmJjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1FpZFNlcGFyYXRvci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBRaWRTZXBhcmF0b3IgZXh0ZW5kcyBFbWZhdGljVG9rZW5Ob2RlIHsKKworCisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IFFpZFNlcGFyYXRvci4KKwkgKi8KKwlwdWJsaWMgUWlkU2VwYXJhdG9yKFRva2VuSW5mbyB0b2tlbkluZm8pIHsKKwkJc3VwZXIodG9rZW5JbmZvKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvUXVhbGlmaWVkSUQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvUXVhbGlmaWVkSUQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2IwNDczCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9RdWFsaWZpZWRJRC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgUXVhbGlmaWVkSUQgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSB7CisKKwlwcml2YXRlIEFycmF5TGlzdCBfY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgQVNUTm9kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKwkJcmV0dXJuIF9jaGlsZHJlbi5zaXplKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlyZXR1cm4gKEFTVE5vZGUpX2NoaWxkcmVuLmdldChpbmRleCk7CisJfQorCisJLyoqCisJICogQWRkIGEgY2hpbGQgdG8gdGhpcyBsaXN0LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZENoaWxkKEVtZmF0aWNBU1ROb2RlIGNoaWxkKSB7CisJCWlmIChjaGlsZCA9PSBudWxsKSByZXR1cm47CisJCWlmIChjaGlsZC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCV9jaGlsZHJlbi5hZGQoY2hpbGQpOworCQljaGlsZC5fcGFyZW50ID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBXcmFwIHRoZSBwcm92aWRlZCBUb2tlbiBpbiBhIEVtZmF0aWNUb2tlbk5vZGUKKwkgKiBhbmQgYWRkIGl0IGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlLgorCSAqIAorCSAqIEBwYXJhbSB0b2tlbiB0aGUgVG9rZW4gdG8gYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChUb2tlbkluZm8gdG9rZW5JbmZvKSB7CisJCWFkZENoaWxkKG5ldyBFbWZhdGljVG9rZW5Ob2RlKHRva2VuSW5mbykpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBRdWFsaWZpZWRJRC4KKwkgKi8KKwlwdWJsaWMgUXVhbGlmaWVkSUQoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvUXVhbGlmaWVkSURDb250YWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvUXVhbGlmaWVkSURDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDI3N2I0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9RdWFsaWZpZWRJRENvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgUXVhbGlmaWVkSURDb250YWluZXIgZXh0ZW5kcyBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCAgeworCisKKwlwcml2YXRlIFF1YWxpZmllZElEIF9xdWFsaWZpZWRJRDsKKworCXB1YmxpYyBRdWFsaWZpZWRJRCBnZXRRdWFsaWZpZWRJRCgpIHsKKwkJcmV0dXJuIF9xdWFsaWZpZWRJRDsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCWludCBjb3VudCA9IDA7CisJCWlmIChfcXVhbGlmaWVkSUQgIT0gbnVsbCkgY291bnQrKzsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlpbnQgY291bnQgPSAtMTsKKwkJaWYgKChfcXVhbGlmaWVkSUQgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3F1YWxpZmllZElEOworCisJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBRdWFsaWZpZWRJRENvbnRhaW5lci4KKwkgKi8KKwlwdWJsaWMgUXVhbGlmaWVkSURDb250YWluZXIoCisJCVF1YWxpZmllZElEIHF1YWxpZmllZElECisJKSB7CisJCXN1cGVyKCk7CisKKwkJaWYgKHF1YWxpZmllZElEICE9IG51bGwpIHsKKwkJCV9xdWFsaWZpZWRJRCA9IHF1YWxpZmllZElEOworCQkJaWYgKF9xdWFsaWZpZWRJRC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfcXVhbGlmaWVkSUQuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1JlZmVyZW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9SZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWRkN2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9SZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIFJlZmVyZW5jZSBleHRlbmRzIENsYXNzTWVtYmVyRGVjbCAgeworCisKKwlwcml2YXRlIEFubm90YXRpb25zIF9hbm5vdGF0aW9uczsKKwlwcml2YXRlIE1vZGlmaWVycyBfbW9kaWZpZXJzOworCXByaXZhdGUgUmVmZXJlbmNlS2luZCBfcmVmZXJlbmNlS2luZDsKKwlwcml2YXRlIFR5cGVXaXRoTXVsdGkgX3R5cGVXaXRoTXVsdGk7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9oYXNoOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfb3Bwb3NpdGVOYW1lOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfbmFtZTsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX3NlbWk7CisKKwlwdWJsaWMgQW5ub3RhdGlvbnMgZ2V0QW5ub3RhdGlvbnMoKSB7CisJCXJldHVybiBfYW5ub3RhdGlvbnM7CisJfQorCXB1YmxpYyBNb2RpZmllcnMgZ2V0TW9kaWZpZXJzKCkgeworCQlyZXR1cm4gX21vZGlmaWVyczsKKwl9CisJcHVibGljIFJlZmVyZW5jZUtpbmQgZ2V0UmVmZXJlbmNlS2luZCgpIHsKKwkJcmV0dXJuIF9yZWZlcmVuY2VLaW5kOworCX0KKwlwdWJsaWMgVHlwZVdpdGhNdWx0aSBnZXRUeXBlV2l0aE11bHRpKCkgeworCQlyZXR1cm4gX3R5cGVXaXRoTXVsdGk7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldEhhc2goKSB7CisJCXJldHVybiBfaGFzaDsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0T3Bwb3NpdGVOYW1lKCkgeworCQlyZXR1cm4gX29wcG9zaXRlTmFtZTsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIF9uYW1lOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRTZW1pKCkgeworCQlyZXR1cm4gX3NlbWk7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX2Fubm90YXRpb25zICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfbW9kaWZpZXJzICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfcmVmZXJlbmNlS2luZCAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX3R5cGVXaXRoTXVsdGkgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9oYXNoICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfb3Bwb3NpdGVOYW1lICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfbmFtZSAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX3NlbWkgIT0gbnVsbCkgY291bnQrKzsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlpbnQgY291bnQgPSAtMTsKKwkJaWYgKChfYW5ub3RhdGlvbnMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2Fubm90YXRpb25zOworCQlpZiAoKF9tb2RpZmllcnMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX21vZGlmaWVyczsKKwkJaWYgKChfcmVmZXJlbmNlS2luZCAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfcmVmZXJlbmNlS2luZDsKKwkJaWYgKChfdHlwZVdpdGhNdWx0aSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfdHlwZVdpdGhNdWx0aTsKKwkJaWYgKChfaGFzaCAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfaGFzaDsKKwkJaWYgKChfb3Bwb3NpdGVOYW1lICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9vcHBvc2l0ZU5hbWU7CisJCWlmICgoX25hbWUgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX25hbWU7CisJCWlmICgoX3NlbWkgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3NlbWk7CisKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IFJlZmVyZW5jZS4KKwkgKi8KKwlwdWJsaWMgUmVmZXJlbmNlKAorCQlBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucywKKwkJTW9kaWZpZXJzIG1vZGlmaWVycywKKwkJUmVmZXJlbmNlS2luZCByZWZlcmVuY2VLaW5kLAorCQlUeXBlV2l0aE11bHRpIHR5cGVXaXRoTXVsdGksCisJCVRva2VuSW5mbyBoYXNoLAorCQlUb2tlbkluZm8gb3Bwb3NpdGVOYW1lLAorCQlUb2tlbkluZm8gbmFtZSwKKwkJVG9rZW5JbmZvIHNlbWkKKwkpIHsKKwkJc3VwZXIoKTsKKworCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisJCQlpZiAoX2Fubm90YXRpb25zLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9hbm5vdGF0aW9ucy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAobW9kaWZpZXJzICE9IG51bGwpIHsKKwkJCV9tb2RpZmllcnMgPSBtb2RpZmllcnM7CisJCQlpZiAoX21vZGlmaWVycy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfbW9kaWZpZXJzLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChyZWZlcmVuY2VLaW5kICE9IG51bGwpIHsKKwkJCV9yZWZlcmVuY2VLaW5kID0gcmVmZXJlbmNlS2luZDsKKwkJCWlmIChfcmVmZXJlbmNlS2luZC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfcmVmZXJlbmNlS2luZC5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAodHlwZVdpdGhNdWx0aSAhPSBudWxsKSB7CisJCQlfdHlwZVdpdGhNdWx0aSA9IHR5cGVXaXRoTXVsdGk7CisJCQlpZiAoX3R5cGVXaXRoTXVsdGkuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3R5cGVXaXRoTXVsdGkuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKGhhc2ggIT0gbnVsbCkgeworCQkJX2hhc2ggPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShoYXNoKTsKKwkJCWlmIChfaGFzaC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfaGFzaC5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAob3Bwb3NpdGVOYW1lICE9IG51bGwpIHsKKwkJCV9vcHBvc2l0ZU5hbWUgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShvcHBvc2l0ZU5hbWUpOworCQkJaWYgKF9vcHBvc2l0ZU5hbWUuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX29wcG9zaXRlTmFtZS5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAobmFtZSAhPSBudWxsKSB7CisJCQlfbmFtZSA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKG5hbWUpOworCQkJaWYgKF9uYW1lLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9uYW1lLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChzZW1pICE9IG51bGwpIHsKKwkJCV9zZW1pID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoc2VtaSk7CisJCQlpZiAoX3NlbWkuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3NlbWkuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1JlZmVyZW5jZUtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvUmVmZXJlbmNlS2luZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOTdiZDYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1JlZmVyZW5jZUtpbmQuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgUmVmZXJlbmNlS2luZCBleHRlbmRzIEVtZmF0aWNUb2tlbk5vZGUgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1dfUkVGID0gInJlZiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1dfVkFMID0gInZhbCI7CisKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgUmVmZXJlbmNlS2luZC4KKwkgKi8KKwlwdWJsaWMgUmVmZXJlbmNlS2luZChUb2tlbkluZm8gdG9rZW5JbmZvKSB7CisJCXN1cGVyKHRva2VuSW5mbyk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1Jlc3VsdFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvUmVzdWx0VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWZmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1Jlc3VsdFR5cGUuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXN1bHRUeXBlIGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgeworCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBSZXN1bHRUeXBlLgorCSAqLworCXB1YmxpYyBSZXN1bHRUeXBlKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9TaW1wbGVNdWx0aXBsaWNpdHlFeHByLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1NpbXBsZU11bHRpcGxpY2l0eUV4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWI3Mjc1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9TaW1wbGVNdWx0aXBsaWNpdHlFeHByLmphdmEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgZXh0ZW5kcyBFbWZhdGljVG9rZW5Ob2RlIHsKKworCisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IFNpbXBsZU11bHRpcGxpY2l0eUV4cHIuCisJICovCisJcHVibGljIFNpbXBsZU11bHRpcGxpY2l0eUV4cHIoVG9rZW5JbmZvIHRva2VuSW5mbykgeworCQlzdXBlcih0b2tlbkluZm8pOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9TdHJpbmdFeHByLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1N0cmluZ0V4cHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODI0MjJlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9TdHJpbmdFeHByLmphdmEKQEAgLTAsMCArMSw3MCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ0V4cHIgZXh0ZW5kcyBEZWZhdWx0VmFsdWVFeHByICB7CisKKworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfc3RyaW5nX2xpdGVyYWw7CisKKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRTdHJpbmdfbGl0ZXJhbCgpIHsKKwkJcmV0dXJuIF9zdHJpbmdfbGl0ZXJhbDsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCWludCBjb3VudCA9IDA7CisJCWlmIChfc3RyaW5nX2xpdGVyYWwgIT0gbnVsbCkgY291bnQrKzsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlpbnQgY291bnQgPSAtMTsKKwkJaWYgKChfc3RyaW5nX2xpdGVyYWwgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3N0cmluZ19saXRlcmFsOworCisJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBTdHJpbmdFeHByLgorCSAqLworCXB1YmxpYyBTdHJpbmdFeHByKAorCQlUb2tlbkluZm8gc3RyaW5nX2xpdGVyYWwKKwkpIHsKKwkJc3VwZXIoKTsKKworCQlpZiAoc3RyaW5nX2xpdGVyYWwgIT0gbnVsbCkgeworCQkJX3N0cmluZ19saXRlcmFsID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoc3RyaW5nX2xpdGVyYWwpOworCQkJaWYgKF9zdHJpbmdfbGl0ZXJhbC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfc3RyaW5nX2xpdGVyYWwuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1N0cmluZ0xpdGVyYWxDb250YWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvU3RyaW5nTGl0ZXJhbENvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MzBiOTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1N0cmluZ0xpdGVyYWxDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDcwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nTGl0ZXJhbENvbnRhaW5lciBleHRlbmRzIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEICB7CisKKworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfc3RyaW5nX2xpdGVyYWw7CisKKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRTdHJpbmdfbGl0ZXJhbCgpIHsKKwkJcmV0dXJuIF9zdHJpbmdfbGl0ZXJhbDsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCWludCBjb3VudCA9IDA7CisJCWlmIChfc3RyaW5nX2xpdGVyYWwgIT0gbnVsbCkgY291bnQrKzsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlpbnQgY291bnQgPSAtMTsKKwkJaWYgKChfc3RyaW5nX2xpdGVyYWwgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3N0cmluZ19saXRlcmFsOworCisJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBTdHJpbmdMaXRlcmFsQ29udGFpbmVyLgorCSAqLworCXB1YmxpYyBTdHJpbmdMaXRlcmFsQ29udGFpbmVyKAorCQlUb2tlbkluZm8gc3RyaW5nX2xpdGVyYWwKKwkpIHsKKwkJc3VwZXIoKTsKKworCQlpZiAoc3RyaW5nX2xpdGVyYWwgIT0gbnVsbCkgeworCQkJX3N0cmluZ19saXRlcmFsID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoc3RyaW5nX2xpdGVyYWwpOworCQkJaWYgKF9zdHJpbmdfbGl0ZXJhbC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfc3RyaW5nX2xpdGVyYWwuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1N0cmluZ0xpdGVyYWxPclF1YWxpZmllZElELmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1N0cmluZ0xpdGVyYWxPclF1YWxpZmllZElELmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiMTc4MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBleHRlbmRzIEVtZmF0aWNBU1ROb2RlIHsKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQuCisJICovCisJcHVibGljIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9TdWJQYWNrYWdlRGVjbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9TdWJQYWNrYWdlRGVjbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NTMzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1N1YlBhY2thZ2VEZWNsLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBTdWJQYWNrYWdlRGVjbCBleHRlbmRzIFRvcExldmVsRGVjbCAgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1dfUEFDS0FHRSA9ICJwYWNrYWdlIjsKKworCXByaXZhdGUgQW5ub3RhdGlvbnMgX2Fubm90YXRpb25zOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfcGFja2FnZV9LVzsKKwlwcml2YXRlIEVtZmF0aWNUb2tlbk5vZGUgX25hbWU7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9sY3VybHk7CisJcHJpdmF0ZSBUb3BMZXZlbERlY2xzIF90b3BMZXZlbERlY2xzOworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfcmN1cmx5OworCisJcHVibGljIEFubm90YXRpb25zIGdldEFubm90YXRpb25zKCkgeworCQlyZXR1cm4gX2Fubm90YXRpb25zOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRQYWNrYWdlX0tXKCkgeworCQlyZXR1cm4gX3BhY2thZ2VfS1c7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldE5hbWUoKSB7CisJCXJldHVybiBfbmFtZTsKKwl9CisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0TGN1cmx5KCkgeworCQlyZXR1cm4gX2xjdXJseTsKKwl9CisJcHVibGljIFRvcExldmVsRGVjbHMgZ2V0VG9wTGV2ZWxEZWNscygpIHsKKwkJcmV0dXJuIF90b3BMZXZlbERlY2xzOworCX0KKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRSY3VybHkoKSB7CisJCXJldHVybiBfcmN1cmx5OworCX0KKworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgQVNUTm9kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJaWYgKF9hbm5vdGF0aW9ucyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX3BhY2thZ2VfS1cgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9uYW1lICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfbGN1cmx5ICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfdG9wTGV2ZWxEZWNscyAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX3JjdXJseSAhPSBudWxsKSBjb3VudCsrOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCWludCBjb3VudCA9IC0xOworCQlpZiAoKF9hbm5vdGF0aW9ucyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfYW5ub3RhdGlvbnM7CisJCWlmICgoX3BhY2thZ2VfS1cgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3BhY2thZ2VfS1c7CisJCWlmICgoX25hbWUgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX25hbWU7CisJCWlmICgoX2xjdXJseSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfbGN1cmx5OworCQlpZiAoKF90b3BMZXZlbERlY2xzICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF90b3BMZXZlbERlY2xzOworCQlpZiAoKF9yY3VybHkgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3JjdXJseTsKKworCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgU3ViUGFja2FnZURlY2wuCisJICovCisJcHVibGljIFN1YlBhY2thZ2VEZWNsKAorCQlBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucywKKwkJVG9rZW5JbmZvIHBhY2thZ2VfS1csCisJCVRva2VuSW5mbyBuYW1lLAorCQlUb2tlbkluZm8gbGN1cmx5LAorCQlUb3BMZXZlbERlY2xzIHRvcExldmVsRGVjbHMsCisJCVRva2VuSW5mbyByY3VybHkKKwkpIHsKKwkJc3VwZXIoKTsKKworCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgeworCQkJX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisJCQlpZiAoX2Fubm90YXRpb25zLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9hbm5vdGF0aW9ucy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAocGFja2FnZV9LVyAhPSBudWxsKSB7CisJCQlfcGFja2FnZV9LVyA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKHBhY2thZ2VfS1cpOworCQkJaWYgKF9wYWNrYWdlX0tXLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9wYWNrYWdlX0tXLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChuYW1lICE9IG51bGwpIHsKKwkJCV9uYW1lID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUobmFtZSk7CisJCQlpZiAoX25hbWUuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX25hbWUuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKGxjdXJseSAhPSBudWxsKSB7CisJCQlfbGN1cmx5ID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUobGN1cmx5KTsKKwkJCWlmIChfbGN1cmx5Ll9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9sY3VybHkuX3BhcmVudCA9IHRoaXM7CisJCX0KKwkJaWYgKHRvcExldmVsRGVjbHMgIT0gbnVsbCkgeworCQkJX3RvcExldmVsRGVjbHMgPSB0b3BMZXZlbERlY2xzOworCQkJaWYgKF90b3BMZXZlbERlY2xzLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV90b3BMZXZlbERlY2xzLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChyY3VybHkgIT0gbnVsbCkgeworCQkJX3JjdXJseSA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKHJjdXJseSk7CisJCQlpZiAoX3JjdXJseS5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfcmN1cmx5Ll9wYXJlbnQgPSB0aGlzOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9Ub3BMZXZlbERlY2wuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvVG9wTGV2ZWxEZWNsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0OGZhOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvVG9wTGV2ZWxEZWNsLmphdmEKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVG9wTGV2ZWxEZWNsIGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgeworCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBUb3BMZXZlbERlY2wuCisJICovCisJcHVibGljIFRvcExldmVsRGVjbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvVG9wTGV2ZWxEZWNscy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9Ub3BMZXZlbERlY2xzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0MWExMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvVG9wTGV2ZWxEZWNscy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgVG9wTGV2ZWxEZWNscyBleHRlbmRzIEVtZmF0aWNBU1ROb2RlIHsKKworCXByaXZhdGUgQXJyYXlMaXN0IF9jaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlyZXR1cm4gX2NoaWxkcmVuLnNpemUoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCXJldHVybiAoQVNUTm9kZSlfY2hpbGRyZW4uZ2V0KGluZGV4KTsKKwl9CisKKwkvKioKKwkgKiBBZGQgYSBjaGlsZCB0byB0aGlzIGxpc3QuCisJICovCisJcHVibGljIHZvaWQgYWRkQ2hpbGQoRW1mYXRpY0FTVE5vZGUgY2hpbGQpIHsKKwkJaWYgKGNoaWxkID09IG51bGwpIHJldHVybjsKKwkJaWYgKGNoaWxkLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJX2NoaWxkcmVuLmFkZChjaGlsZCk7CisJCWNoaWxkLl9wYXJlbnQgPSB0aGlzOworCX0KKworCS8qKgorCSAqIFdyYXAgdGhlIHByb3ZpZGVkIFRva2VuIGluIGEgRW1mYXRpY1Rva2VuTm9kZQorCSAqIGFuZCBhZGQgaXQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGUuCisJICogCisJICogQHBhcmFtIHRva2VuIHRoZSBUb2tlbiB0byBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZQorCSAqLworCXB1YmxpYyB2b2lkIGFkZENoaWxkKFRva2VuSW5mbyB0b2tlbkluZm8pIHsKKwkJYWRkQ2hpbGQobmV3IEVtZmF0aWNUb2tlbk5vZGUodG9rZW5JbmZvKSk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IFRvcExldmVsRGVjbHMuCisJICovCisJcHVibGljIFRvcExldmVsRGVjbHMoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvVHJhbnNpZW50TW9kaWZpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvVHJhbnNpZW50TW9kaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDgxZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9UcmFuc2llbnRNb2RpZmllci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc2llbnRNb2RpZmllciBleHRlbmRzIEVtZmF0aWNBU1ROb2RlICB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLV19UUkFOU0lFTlQgPSAidHJhbnNpZW50IjsKKworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfdHJhbnNpZW50X0tXOworCisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0VHJhbnNpZW50X0tXKCkgeworCQlyZXR1cm4gX3RyYW5zaWVudF9LVzsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIEFTVE5vZGUKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7CisJCWludCBjb3VudCA9IDA7CisJCWlmIChfdHJhbnNpZW50X0tXICE9IG51bGwpIGNvdW50Kys7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJaW50IGNvdW50ID0gLTE7CisJCWlmICgoX3RyYW5zaWVudF9LVyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfdHJhbnNpZW50X0tXOworCisJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBUcmFuc2llbnRNb2RpZmllci4KKwkgKi8KKwlwdWJsaWMgVHJhbnNpZW50TW9kaWZpZXIoCisJCVRva2VuSW5mbyB0cmFuc2llbnRfS1cKKwkpIHsKKwkJc3VwZXIoKTsKKworCQlpZiAodHJhbnNpZW50X0tXICE9IG51bGwpIHsKKwkJCV90cmFuc2llbnRfS1cgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZSh0cmFuc2llbnRfS1cpOworCQkJaWYgKF90cmFuc2llbnRfS1cuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3RyYW5zaWVudF9LVy5fcGFyZW50ID0gdGhpczsKKwkJfQorCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvVHJ1ZU9yRmFsc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvVHJ1ZU9yRmFsc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE0YmU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9UcnVlT3JGYWxzZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBUcnVlT3JGYWxzZSBleHRlbmRzIEVtZmF0aWNUb2tlbk5vZGUgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1dfVFJVRSA9ICJ0cnVlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLV19GQUxTRSA9ICJmYWxzZSI7CisKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgVHJ1ZU9yRmFsc2UuCisJICovCisJcHVibGljIFRydWVPckZhbHNlKFRva2VuSW5mbyB0b2tlbkluZm8pIHsKKwkJc3VwZXIodG9rZW5JbmZvKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvVHlwZUFyZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9UeXBlQXJnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwYmNmYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvVHlwZUFyZy5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFR5cGVBcmcgZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSB7CisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IFR5cGVBcmcuCisJICovCisJcHVibGljIFR5cGVBcmcoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1R5cGVCb3VuZHNJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1R5cGVCb3VuZHNJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzYzJlNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvVHlwZUJvdW5kc0luZm8uamF2YQpAQCAtMCwwICsxLDgzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgVHlwZUJvdW5kc0luZm8gZXh0ZW5kcyBFbWZhdGljQVNUTm9kZSAgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1dfRVhURU5EUyA9ICJleHRlbmRzIjsKKworCXByaXZhdGUgRW1mYXRpY1Rva2VuTm9kZSBfZXh0ZW5kc19LVzsKKwlwcml2YXRlIE9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyBfb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzOworCisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0RXh0ZW5kc19LVygpIHsKKwkJcmV0dXJuIF9leHRlbmRzX0tXOworCX0KKwlwdWJsaWMgT25lT3JNb3JlVHlwZVBhcmFtQm91bmRzIGdldE9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcygpIHsKKwkJcmV0dXJuIF9vbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHM7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX2V4dGVuZHNfS1cgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9vbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMgIT0gbnVsbCkgY291bnQrKzsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlpbnQgY291bnQgPSAtMTsKKwkJaWYgKChfZXh0ZW5kc19LVyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfZXh0ZW5kc19LVzsKKwkJaWYgKChfb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9vbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHM7CisKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IFR5cGVCb3VuZHNJbmZvLgorCSAqLworCXB1YmxpYyBUeXBlQm91bmRzSW5mbygKKwkJVG9rZW5JbmZvIGV4dGVuZHNfS1csCisJCU9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMKKwkpIHsKKwkJc3VwZXIoKTsKKworCQlpZiAoZXh0ZW5kc19LVyAhPSBudWxsKSB7CisJCQlfZXh0ZW5kc19LVyA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKGV4dGVuZHNfS1cpOworCQkJaWYgKF9leHRlbmRzX0tXLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9leHRlbmRzX0tXLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMgIT0gbnVsbCkgeworCQkJX29uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyA9IG9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kczsKKwkJCWlmIChfb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9vbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1R5cGVQYXJhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9UeXBlUGFyYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODIwYzA3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9UeXBlUGFyYW0uamF2YQpAQCAtMCwwICsxLDgyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworLyoqCisgKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDYuMDIuMjAwNyAxNzo1NzozNAorICovCitwdWJsaWMgY2xhc3MgVHlwZVBhcmFtIGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgIHsKKworCisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF90eXBlVmFyTmFtZTsKKwlwcml2YXRlIFR5cGVCb3VuZHNJbmZvIF90eXBlQm91bmRzSW5mbzsKKworCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldFR5cGVWYXJOYW1lKCkgeworCQlyZXR1cm4gX3R5cGVWYXJOYW1lOworCX0KKwlwdWJsaWMgVHlwZUJvdW5kc0luZm8gZ2V0VHlwZUJvdW5kc0luZm8oKSB7CisJCXJldHVybiBfdHlwZUJvdW5kc0luZm87CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX3R5cGVWYXJOYW1lICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfdHlwZUJvdW5kc0luZm8gIT0gbnVsbCkgY291bnQrKzsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlpbnQgY291bnQgPSAtMTsKKwkJaWYgKChfdHlwZVZhck5hbWUgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3R5cGVWYXJOYW1lOworCQlpZiAoKF90eXBlQm91bmRzSW5mbyAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfdHlwZUJvdW5kc0luZm87CisKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IFR5cGVQYXJhbS4KKwkgKi8KKwlwdWJsaWMgVHlwZVBhcmFtKAorCQlUb2tlbkluZm8gdHlwZVZhck5hbWUsCisJCVR5cGVCb3VuZHNJbmZvIHR5cGVCb3VuZHNJbmZvCisJKSB7CisJCXN1cGVyKCk7CisKKwkJaWYgKHR5cGVWYXJOYW1lICE9IG51bGwpIHsKKwkJCV90eXBlVmFyTmFtZSA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKHR5cGVWYXJOYW1lKTsKKwkJCWlmIChfdHlwZVZhck5hbWUuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3R5cGVWYXJOYW1lLl9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmICh0eXBlQm91bmRzSW5mbyAhPSBudWxsKSB7CisJCQlfdHlwZUJvdW5kc0luZm8gPSB0eXBlQm91bmRzSW5mbzsKKwkJCWlmIChfdHlwZUJvdW5kc0luZm8uX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX3R5cGVCb3VuZHNJbmZvLl9wYXJlbnQgPSB0aGlzOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9UeXBlUGFyYW1zSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9UeXBlUGFyYW1zSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDhjM2UKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1R5cGVQYXJhbXNJbmZvLmphdmEKQEAgLTAsMCArMSw5NCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIFR5cGVQYXJhbXNJbmZvIGV4dGVuZHMgRW1mYXRpY0FTVE5vZGUgIHsKKworCisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9sdDsKKwlwcml2YXRlIE9uZU9yTW9yZVR5cGVQYXJhbXMgX29uZU9yTW9yZVR5cGVQYXJhbXM7CisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9ndDsKKworCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldEx0KCkgeworCQlyZXR1cm4gX2x0OworCX0KKwlwdWJsaWMgT25lT3JNb3JlVHlwZVBhcmFtcyBnZXRPbmVPck1vcmVUeXBlUGFyYW1zKCkgeworCQlyZXR1cm4gX29uZU9yTW9yZVR5cGVQYXJhbXM7CisJfQorCXB1YmxpYyBFbWZhdGljVG9rZW5Ob2RlIGdldEd0KCkgeworCQlyZXR1cm4gX2d0OworCX0KKworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgQVNUTm9kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJaWYgKF9sdCAhPSBudWxsKSBjb3VudCsrOworCQlpZiAoX29uZU9yTW9yZVR5cGVQYXJhbXMgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9ndCAhPSBudWxsKSBjb3VudCsrOworCisJCXJldHVybiBjb3VudDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGEgY2hpbGQgQVNUTm9kZSB0byBnZXQKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBBU1ROb2RlIGF0IHRoZSBnaXZlbiBpbmRleAorCSAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB3aGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzCisJICovCisJcHVibGljIEFTVE5vZGUgZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisJCWludCBjb3VudCA9IC0xOworCQlpZiAoKF9sdCAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfbHQ7CisJCWlmICgoX29uZU9yTW9yZVR5cGVQYXJhbXMgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX29uZU9yTW9yZVR5cGVQYXJhbXM7CisJCWlmICgoX2d0ICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9ndDsKKworCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYSBuZXcgVHlwZVBhcmFtc0luZm8uCisJICovCisJcHVibGljIFR5cGVQYXJhbXNJbmZvKAorCQlUb2tlbkluZm8gbHQsCisJCU9uZU9yTW9yZVR5cGVQYXJhbXMgb25lT3JNb3JlVHlwZVBhcmFtcywKKwkJVG9rZW5JbmZvIGd0CisJKSB7CisJCXN1cGVyKCk7CisKKwkJaWYgKGx0ICE9IG51bGwpIHsKKwkJCV9sdCA9IG5ldyBFbWZhdGljVG9rZW5Ob2RlKGx0KTsKKwkJCWlmIChfbHQuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2x0Ll9wYXJlbnQgPSB0aGlzOworCQl9CisJCWlmIChvbmVPck1vcmVUeXBlUGFyYW1zICE9IG51bGwpIHsKKwkJCV9vbmVPck1vcmVUeXBlUGFyYW1zID0gb25lT3JNb3JlVHlwZVBhcmFtczsKKwkJCWlmIChfb25lT3JNb3JlVHlwZVBhcmFtcy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfb25lT3JNb3JlVHlwZVBhcmFtcy5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoZ3QgIT0gbnVsbCkgeworCQkJX2d0ID0gbmV3IEVtZmF0aWNUb2tlbk5vZGUoZ3QpOworCQkJaWYgKF9ndC5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfZ3QuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1R5cGVXaXRoTXVsdGkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvVHlwZVdpdGhNdWx0aS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZTQ4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1R5cGVXaXRoTXVsdGkuamF2YQpAQCAtMCwwICsxLDgxIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIFR5cGVXaXRoTXVsdGkgZXh0ZW5kcyBSZXN1bHRUeXBlICB7CisKKworCXByaXZhdGUgQm91bmRFeGNlcHRXaWxkY2FyZCBfbmFtZTsKKwlwcml2YXRlIE11bHRpcGxpY2l0eSBfbXVsdGlwbGljaXR5OworCisJcHVibGljIEJvdW5kRXhjZXB0V2lsZGNhcmQgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIF9uYW1lOworCX0KKwlwdWJsaWMgTXVsdGlwbGljaXR5IGdldE11bHRpcGxpY2l0eSgpIHsKKwkJcmV0dXJuIF9tdWx0aXBsaWNpdHk7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX25hbWUgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9tdWx0aXBsaWNpdHkgIT0gbnVsbCkgY291bnQrKzsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBhIGNoaWxkIEFTVE5vZGUgdG8gZ2V0CisJICogQHJldHVybiB0aGUgY2hpbGQgQVNUTm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKwkgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gd2hlbiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcworCSAqLworCXB1YmxpYyBBU1ROb2RlIGdldENoaWxkKGludCBpbmRleCkgeworCQlpbnQgY291bnQgPSAtMTsKKwkJaWYgKChfbmFtZSAhPSBudWxsKSAmJiAoKytjb3VudCA9PSBpbmRleCkpIHJldHVybiBfbmFtZTsKKwkJaWYgKChfbXVsdGlwbGljaXR5ICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9tdWx0aXBsaWNpdHk7CisKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IFR5cGVXaXRoTXVsdGkuCisJICovCisJcHVibGljIFR5cGVXaXRoTXVsdGkoCisJCUJvdW5kRXhjZXB0V2lsZGNhcmQgbmFtZSwKKwkJTXVsdGlwbGljaXR5IG11bHRpcGxpY2l0eQorCSkgeworCQlzdXBlcigpOworCisJCWlmIChuYW1lICE9IG51bGwpIHsKKwkJCV9uYW1lID0gbmFtZTsKKwkJCWlmIChfbmFtZS5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfbmFtZS5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAobXVsdGlwbGljaXR5ICE9IG51bGwpIHsKKwkJCV9tdWx0aXBsaWNpdHkgPSBtdWx0aXBsaWNpdHk7CisJCQlpZiAoX211bHRpcGxpY2l0eS5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfbXVsdGlwbGljaXR5Ll9wYXJlbnQgPSB0aGlzOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIHN1cGVyY2xhc3MgPGNvZGU+YWNjZXB0SW1wbDwvY29kZT4gcHJvdmlkaW5nCisJICogdGhlIHNhbWUgaW1wbGVtZW50YXRpb24uICBIZXJlIDxjb2RlPnRoaXM8L2NvZGU+IHJlZmVycyB0byB0aGlzIHNwZWNpZmljIG5vZGUKKwkgKiBjbGFzcywgc28gdGhlIDxjb2RlPmJlZ2luVmlzaXQ8L2NvZGU+IGFuZCA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kcworCSAqIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBpbiB0aGUgdmlzaXRvciB3aWxsIGJlIGludm9rZWQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0SW1wbChFbWZhdGljQVNUTm9kZVZpc2l0b3IgdmlzaXRvcikgeworCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLmJlZ2luVmlzaXQodGhpcyk7CisJCWlmICh2aXNpdENoaWxkcmVuKSB2aXNpdENoaWxkcmVuKHZpc2l0b3IpOworCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9Wb2lkQ29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vYXN0L1ZvaWRDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2Q0ODRjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9Wb2lkQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSw3MSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5Ub2tlbkluZm87CisKKy8qKgorICoKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA2LjAyLjIwMDcgMTc6NTc6MzQKKyAqLworcHVibGljIGNsYXNzIFZvaWRDb250YWluZXIgZXh0ZW5kcyBSZXN1bHRUeXBlICB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLV19WT0lEID0gInZvaWQiOworCisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF92b2lkX0tXOworCisJcHVibGljIEVtZmF0aWNUb2tlbk5vZGUgZ2V0Vm9pZF9LVygpIHsKKwkJcmV0dXJuIF92b2lkX0tXOworCX0KKworCisJLyoqCisJICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoaXMgQVNUTm9kZQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKwkJaW50IGNvdW50ID0gMDsKKwkJaWYgKF92b2lkX0tXICE9IG51bGwpIGNvdW50Kys7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJaW50IGNvdW50ID0gLTE7CisJCWlmICgoX3ZvaWRfS1cgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX3ZvaWRfS1c7CisKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGEgbmV3IFZvaWRDb250YWluZXIuCisJICovCisJcHVibGljIFZvaWRDb250YWluZXIoCisJCVRva2VuSW5mbyB2b2lkX0tXCisJKSB7CisJCXN1cGVyKCk7CisKKwkJaWYgKHZvaWRfS1cgIT0gbnVsbCkgeworCQkJX3ZvaWRfS1cgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZSh2b2lkX0tXKTsKKwkJCWlmIChfdm9pZF9LVy5fcGFyZW50ICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisJCQlfdm9pZF9LVy5fcGFyZW50ID0gdGhpczsKKwkJfQorCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzIDxjb2RlPmFjY2VwdEltcGw8L2NvZGU+IHByb3ZpZGluZworCSAqIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uLiAgSGVyZSA8Y29kZT50aGlzPC9jb2RlPiByZWZlcnMgdG8gdGhpcyBzcGVjaWZpYyBub2RlCisJICogY2xhc3MsIHNvIHRoZSA8Y29kZT5iZWdpblZpc2l0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+IG1ldGhvZHMKKwkgKiBzcGVjaWZpYyB0byB0aGlzIHR5cGUgaW4gdGhlIHZpc2l0b3Igd2lsbCBiZSBpbnZva2VkLgorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdEltcGwoRW1mYXRpY0FTVE5vZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci5iZWdpblZpc2l0KHRoaXMpOworCQlpZiAodmlzaXRDaGlsZHJlbikgdmlzaXRDaGlsZHJlbih2aXNpdG9yKTsKKwkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvV2lsZGNhcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9hc3QvV2lsZGNhcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWJjMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL2FzdC9XaWxkY2FyZC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuVG9rZW5JbmZvOworCisvKioKKyAqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwNi4wMi4yMDA3IDE3OjU3OjM0CisgKi8KK3B1YmxpYyBjbGFzcyBXaWxkY2FyZCBleHRlbmRzIFR5cGVBcmcgIHsKKworCisJcHJpdmF0ZSBFbWZhdGljVG9rZW5Ob2RlIF9xbWFyazsKKwlwcml2YXRlIEV4dGVuZHNPclN1cGVyIF9leHRlbmRzT3JTdXBlcjsKKwlwcml2YXRlIEJvdW5kRXhjZXB0V2lsZGNhcmQgX2JvdW5kRXhjZXB0V2lsZGNhcmQ7CisKKwlwdWJsaWMgRW1mYXRpY1Rva2VuTm9kZSBnZXRRbWFyaygpIHsKKwkJcmV0dXJuIF9xbWFyazsKKwl9CisJcHVibGljIEV4dGVuZHNPclN1cGVyIGdldEV4dGVuZHNPclN1cGVyKCkgeworCQlyZXR1cm4gX2V4dGVuZHNPclN1cGVyOworCX0KKwlwdWJsaWMgQm91bmRFeGNlcHRXaWxkY2FyZCBnZXRCb3VuZEV4Y2VwdFdpbGRjYXJkKCkgeworCQlyZXR1cm4gX2JvdW5kRXhjZXB0V2lsZGNhcmQ7CisJfQorCisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb2YgdGhpcyBBU1ROb2RlCisJICovCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAoX3FtYXJrICE9IG51bGwpIGNvdW50Kys7CisJCWlmIChfZXh0ZW5kc09yU3VwZXIgIT0gbnVsbCkgY291bnQrKzsKKwkJaWYgKF9ib3VuZEV4Y2VwdFdpbGRjYXJkICE9IG51bGwpIGNvdW50Kys7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYSBjaGlsZCBBU1ROb2RlIHRvIGdldAorCSAqIEByZXR1cm4gdGhlIGNoaWxkIEFTVE5vZGUgYXQgdGhlIGdpdmVuIGluZGV4CisJICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHdoZW4gdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMKKwkgKi8KKwlwdWJsaWMgQVNUTm9kZSBnZXRDaGlsZChpbnQgaW5kZXgpIHsKKwkJaW50IGNvdW50ID0gLTE7CisJCWlmICgoX3FtYXJrICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9xbWFyazsKKwkJaWYgKChfZXh0ZW5kc09yU3VwZXIgIT0gbnVsbCkgJiYgKCsrY291bnQgPT0gaW5kZXgpKSByZXR1cm4gX2V4dGVuZHNPclN1cGVyOworCQlpZiAoKF9ib3VuZEV4Y2VwdFdpbGRjYXJkICE9IG51bGwpICYmICgrK2NvdW50ID09IGluZGV4KSkgcmV0dXJuIF9ib3VuZEV4Y2VwdFdpbGRjYXJkOworCisJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIG5ldyBXaWxkY2FyZC4KKwkgKi8KKwlwdWJsaWMgV2lsZGNhcmQoCisJCVRva2VuSW5mbyBxbWFyaywKKwkJRXh0ZW5kc09yU3VwZXIgZXh0ZW5kc09yU3VwZXIsCisJCUJvdW5kRXhjZXB0V2lsZGNhcmQgYm91bmRFeGNlcHRXaWxkY2FyZAorCSkgeworCQlzdXBlcigpOworCisJCWlmIChxbWFyayAhPSBudWxsKSB7CisJCQlfcW1hcmsgPSBuZXcgRW1mYXRpY1Rva2VuTm9kZShxbWFyayk7CisJCQlpZiAoX3FtYXJrLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9xbWFyay5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoZXh0ZW5kc09yU3VwZXIgIT0gbnVsbCkgeworCQkJX2V4dGVuZHNPclN1cGVyID0gZXh0ZW5kc09yU3VwZXI7CisJCQlpZiAoX2V4dGVuZHNPclN1cGVyLl9wYXJlbnQgIT0gbnVsbCkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKwkJCV9leHRlbmRzT3JTdXBlci5fcGFyZW50ID0gdGhpczsKKwkJfQorCQlpZiAoYm91bmRFeGNlcHRXaWxkY2FyZCAhPSBudWxsKSB7CisJCQlfYm91bmRFeGNlcHRXaWxkY2FyZCA9IGJvdW5kRXhjZXB0V2lsZGNhcmQ7CisJCQlpZiAoX2JvdW5kRXhjZXB0V2lsZGNhcmQuX3BhcmVudCAhPSBudWxsKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCQkJX2JvdW5kRXhjZXB0V2lsZGNhcmQuX3BhcmVudCA9IHRoaXM7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyB0aGUgc3VwZXJjbGFzcyA8Y29kZT5hY2NlcHRJbXBsPC9jb2RlPiBwcm92aWRpbmcKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbi4gIEhlcmUgPGNvZGU+dGhpczwvY29kZT4gcmVmZXJzIHRvIHRoaXMgc3BlY2lmaWMgbm9kZQorCSAqIGNsYXNzLCBzbyB0aGUgPGNvZGU+YmVnaW5WaXNpdDwvY29kZT4gYW5kIDxjb2RlPmVuZFZpc2l0PC9jb2RlPiBtZXRob2RzCisJICogc3BlY2lmaWMgdG8gdGhpcyB0eXBlIGluIHRoZSB2aXNpdG9yIHdpbGwgYmUgaW52b2tlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRJbXBsKEVtZmF0aWNBU1ROb2RlVmlzaXRvciB2aXNpdG9yKSB7CisJCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IuYmVnaW5WaXNpdCh0aGlzKTsKKwkJaWYgKHZpc2l0Q2hpbGRyZW4pIHZpc2l0Q2hpbGRyZW4odmlzaXRvcik7CisJCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vcGFyc2VyL0VtZmF0aWMyLmpqIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL3BhcnNlci9FbWZhdGljMi5qagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDFhNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL3BhcnNlci9FbWZhdGljMi5qagpAQCAtMCwwICsxLDcxNiBAQAorLyoqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwOS4wMi4yMDA3IDEzOjAzOjA1CisgKi8KKworb3B0aW9ucyB7CisgIEpES19WRVJTSU9OID0gIjEuNSI7CisgIFNUQVRJQyA9IGZhbHNlIDsKKyAgTE9PS0FIRUFEPTQ7IAorICBGT1JDRV9MQV9DSEVDSyA9IHRydWU7IAorfQorCitQQVJTRVJfQkVHSU4oRW1mYXRpY1BhcnNlcikKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC4qOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY1BhcnNlciB7CisKKyAgcHVibGljIFRva2VuSW5mbyBjcmVhdGVUb2tlbkluZm8oVG9rZW4gdG9rKSB7CisgICAgaWYgKCEodG9rIGluc3RhbmNlb2YgRXh0VG9rZW4pKSByZXR1cm4gbnVsbDsKKyAgICAKKyAgICBFeHRUb2tlbiBleHRUb2tlbiA9IChFeHRUb2tlbikgdG9rOworICAgIHJldHVybiBuZXcgVG9rZW5JbmZvKHRvay5pbWFnZSwgZXh0VG9rZW4udG9rZW5PZmZzZXQsIHRvay5raW5kKTsKKyAgfQorCit9CitQQVJTRVJfRU5EKEVtZmF0aWNQYXJzZXIpCisKK1NLSVAgOgoreworICAgIDwgU0lOR0xFTElORUNPTU1FTlQgOiA8RE9VQkxFU0xBU0g+ICh+WyJcbiIsIlxyIl0pKiAoIlxuInwiXHJcbiIpPgorfCAgIDwgV1MgOiAoWyIgIiwgIlx0IiwgIlxmIiwgIlxyIiwgIlxuIl0pKyAgPgorfCAgICIvKiIgOiBXaXRoaW5Db21tZW50Cit9Cis8V2l0aGluQ29tbWVudD4gU0tJUCA6Cit7CisgICAgIiovIiA6IERFRkFVTFQKK30gICAgCis8V2l0aGluQ29tbWVudD4gTU9SRSAgOiAKK3sKKyAgICA8IH5bXSA+Cit9CisKK1RPS0VOIDogCit7CisgICAgPCBQQUNLQUdFS1cgICA6ICJwYWNrYWdlIiA+Cit8ICAgPCBDTEFTU0tXICAgOiAiY2xhc3MiID4KK3wgICA8IElNUE9SVEtXICA6ICJpbXBvcnQiID4KK3wgICA8IEFCU1RSQUNUS1cgIDogImFic3RyYWN0IiA+IAorfCAgIDwgSU5URVJGQUNFS1cgOiAiaW50ZXJmYWNlIiA+Cit8ICAgPCBFWFRFTkRTS1cgICA6ICJleHRlbmRzIiA+Cit8ICAgPCBTVVBFUktXICA6ICJzdXBlciIgPgorfCAgIDwgQVRUUktXICAgOiAiYXR0ciIgPiAgICAgICAgCit8ICAgPCBSRUZLVyAgICA6ICJyZWYiID4KK3wgICA8IFZBTEtXICAgOiAidmFsIiA+Cit8ICAgPCBSRUFET05MWUtXICAgOiAicmVhZG9ubHkiID4KK3wgICA8ICBWT0xBVElMRUtXIDogInZvbGF0aWxlIiA+Cit8ICAgPCAgVFJBTlNJRU5US1cgOiAidHJhbnNpZW50IiA+IAorfCAgIDwgIFVOU0VUVEFCTEVLVyA6ICJ1bnNldHRhYmxlIiA+ICAKK3wgICA8ICBERVJJVkVES1cgOiAiZGVyaXZlZCIgPgorfCAgIDwgIFVOSVFVRUtXIDogInVuaXF1ZSIgPiAKK3wgICA8ICBPUkRFUkVES1cgOiAib3JkZXJlZCIgPiAKK3wgICA8ICBSRVNPTFZFS1cgOiAicmVzb2x2ZSIgPgorfCAgIDwgIElES1cgOiAiaWQiID4gCit8ICAgPCAgVFJVRUtXIDogInRydWUiID4gIAorfCAgIDwgIEZBTFNFS1cgOiAiZmFsc2UiID4KK3wgICA8ICBPUEtXIDogIm9wIiA+IAorfCAgIDwgIFZPSURLVyA6ICJ2b2lkIiA+IAorfCAgIDwgIERBVEFUWVBFS1cgOiAiZGF0YXR5cGUiID4gCit8ICAgPCAgRU5VTUtXIDogImVudW0iID4gCit8ICAgPCAgTUFQRU5UUllLVyA6ICJtYXBlbnRyeSIgPiAKK3wgICA8ICBUSFJPV1NLVyA6ICJ0aHJvd3MiID4gCisKK3wJPCAjRE9VQkxFU0xBU0ggOiAiLy8iID4KK3wgICA8ICNET1VCTEVRVU9URSA6ICJcIiIgPiAKK3wgICA8ICNTSU5HTEVRVU9URSA6ICInIiAgPgorfCAgIDwgI0JBQ0tTTEFTSCAgIDogIlxcIiAgPgorCQorfAk8IExDVVJMWSAgOiAieyIgPiAKK3wgICA8IFJDVVJMWSAgOiAifSIgPgorfCAgIDwgTFNRVUFSRSA6ICJbIiA+IAorfCAgIDwgUlNRVUFSRSA6ICJdIiA+IAorfCAgIDwgTFBBUkVOICA6ICIoIiA+IAorfCAgIDwgUlBBUkVOICA6ICIpIiA+IAorCit8ICAgPCBET1QgICAgIDogIi4iPiAKK3wgICA8IENPTU1BICAgOiAiLCI+IAorfCAgIDwgQ09MT04gICA6ICI6Ij4gCit8ICAgPCBTRU1JICAgIDogIjsiPiAKKworfCAgIDwgU1RBUiAgICA6ICIqIj4gCit8ICAgPCBQTFVTICAgIDogIisiPiAKK3wgICA8IE1JTlVTICAgOiAiLSI+IAorfCAgIDwgRVFVQUxTICA6ICI9Ij4gCisKK3wgICA8IFFNQVJLICAgOiAiPyI+IAorfCAgIDwgQkFORyAgICA6ICIhIj4gCit8ICAgPCBET0xMQVIgIDogIiQiPiAKK3wgICA8IEhBU0ggICAgOiAiIyI+IAorfCAgIDwgQVQgICAgICA6ICJAIj4gCisKK3wgICA8IERPVF9ET1QgIDogIi4uIj4gCit8ICAgPCBNSU5VU19HVCA6ICItPiI+IAorfCAgIDwgR1RfTFQgICAgOiAiPjwiPiAKK3wgICA8IExUX0dUICAgIDogIjw+Ij4gCisKK3wgICA8IEFNUCA6ICImIiA+IAorfCAgIDwgTFQgIDogIjwiID4gCit8ICAgPCBHVCAgOiAiPiIgPiAKKworfCAgIDwgU1RSSU5HX0xJVEVSQUwgOiA8RE9VQkxFUVVPVEU+ICg8RVNDPiB8IH5bIlwiIl0pKiA8RE9VQkxFUVVPVEU+ID4KK3wgICA8IENIQVJfTElURVJBTCAgIDogPFNJTkdMRVFVT1RFPiAoPEVTQz4gfCAoflsiJyJdKSkgPFNJTkdMRVFVT1RFPiA+CisKK3wgICA8ICNMRVRURVJPUlVOREVSU0NPUkUgOiBbImEiLSJ6IiwgIkEiLSJaIiwgIl8iXSA+IAorfCAgIDwgI0xFVFRFUk9SVU5ERVJTQ09SRU9SRElHSVQgOiAoIDxMRVRURVJPUlVOREVSU0NPUkU+IHwgPERJR0lUPiApID4gCisKK3wgPCBJTlRfTElURVJBTCA6ICg8RElHSVQ+KSsgPiAKKworfCA8ICNESUdJVCA6IFsiMCItIjkiXSAgPiAKKworLy8gVE9ETzogVGhlIDxESUdJVERJR0lURElHSVQ+IGlzIGNoZWVzeSBpdCBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UKKy8vICAgICAgICggb3B0aW9ucyB7IHdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsgfSA6IChESUdJVCkrICkKKy8vICAgICAgIGJ1dCBJIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIHBhcnNpbmcgdGhhdCB5ZXQuCit8IDwgI0VTQyA6IDxCQUNLU0xBU0g+ICgidCIgfCAiZiIgfCAiciIgfCAibiIgfCA8RE9VQkxFUVVPVEU+IHwgPFNJTkdMRVFVT1RFPiB8IDxCQUNLU0xBU0g+IHwgPERJR0lURElHSVRESUdJVD4gKSA+IAorfCA8ICNESUdJVERJR0lURElHSVQgOiA8RElHSVQ+IDxESUdJVD4gPERJR0lUPiA+Cit9CisKK1RPS0VOIDoKK3sKKyA8IElEIDogKCJ+Iik/IDxMRVRURVJPUlVOREVSU0NPUkU+ICg8TEVUVEVST1JVTkRFUlNDT1JFT1JESUdJVD4pKiA+Cit9CisKKworQ29tcFVuaXQgY29tcFVuaXQoKSA6Cit7IENvbXBVbml0IHJldFZhbCA9IG51bGw7CisgIFBhY2thZ2VEZWNsIHBhY2thZ2VEZWNsID0gbnVsbDsKKyAgSW1wb3J0U3RtdHMgaW1wb3J0U3RtdHMgPSBudWxsOworICBUb3BMZXZlbERlY2xzIHRvcExldmVsRGVjbHMgPSBudWxsOyB9Cit7CitwYWNrYWdlRGVjbD1wYWNrYWdlRGVjbCgpIGltcG9ydFN0bXRzPWltcG9ydFN0bXRzKCkgdG9wTGV2ZWxEZWNscz10b3BMZXZlbERlY2xzKCkgPEVPRj4KKyAgeyByZXRWYWwgPSBuZXcgQ29tcFVuaXQocGFja2FnZURlY2wsIGltcG9ydFN0bXRzLCB0b3BMZXZlbERlY2xzKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK1BhY2thZ2VEZWNsIHBhY2thZ2VEZWNsKCkgOgoreyBQYWNrYWdlRGVjbCByZXRWYWwgPSBudWxsOworICBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyA9IG51bGw7CisgIFRva2VuIHBhY2thZ2VfS1cgPSBudWxsOworICBRdWFsaWZpZWRJRCBuYW1lID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7IH0KK3sKK2Fubm90YXRpb25zPWFubm90YXRpb25zKCkgcGFja2FnZV9LVz08UEFDS0FHRUtXPiBuYW1lPXF1YWxpZmllZElEKCkgc2VtaT08U0VNST4gCisgIHsgcmV0VmFsID0gbmV3IFBhY2thZ2VEZWNsKGFubm90YXRpb25zLCBjcmVhdGVUb2tlbkluZm8ocGFja2FnZV9LVyksIG5hbWUsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitRdWFsaWZpZWRJRCBxdWFsaWZpZWRJRCgpIDoKK3sgUXVhbGlmaWVkSUQgcmV0VmFsID0gbmV3IFF1YWxpZmllZElEKCk7CisgIFRva2VuIGlkMSA9IG51bGw7CisgIFFpZFNlcGFyYXRvciBxaWRTZXBhcmF0b3IgPSBudWxsOworICBUb2tlbiBpZG4gPSBudWxsOyB9Cit7ICggaWQxPTxJRD4geyByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGlkMSkpOyB9ICkKKyAgKCBxaWRTZXBhcmF0b3I9cWlkU2VwYXJhdG9yKCkgaWRuPTxJRD4geyByZXRWYWwuYWRkQ2hpbGQocWlkU2VwYXJhdG9yKTsgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhpZG4pKTsgfSApKiB7IHJldHVybiByZXRWYWw7IH0gfQorCitRaWRTZXBhcmF0b3IgcWlkU2VwYXJhdG9yKCkgOgoreyBUb2tlbiB0b2s7IH0KK3sgdG9rPTxET1Q+IHsgcmV0dXJuIG5ldyBRaWRTZXBhcmF0b3IgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PERPTExBUj4geyByZXR1cm4gbmV3IFFpZFNlcGFyYXRvciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit9CisKK1N0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKCkgOgoreyBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCByZXRWYWwgPSBudWxsOyB9Cit7CisgICggcmV0VmFsPXN0cmluZ0xpdGVyYWxDb250YWluZXIoKSB7IHJldHVybiByZXRWYWw7IH0KKyAgfCByZXRWYWw9cXVhbGlmaWVkSURDb250YWluZXIoKSB7IHJldHVybiByZXRWYWw7IH0KKyAgKQorfQorCitTdHJpbmdMaXRlcmFsQ29udGFpbmVyIHN0cmluZ0xpdGVyYWxDb250YWluZXIoKSA6Cit7IFN0cmluZ0xpdGVyYWxDb250YWluZXIgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gc3RyaW5nX2xpdGVyYWwgPSBudWxsOyB9Cit7CitzdHJpbmdfbGl0ZXJhbD08U1RSSU5HX0xJVEVSQUw+IAorICB7IHJldFZhbCA9IG5ldyBTdHJpbmdMaXRlcmFsQ29udGFpbmVyKGNyZWF0ZVRva2VuSW5mbyhzdHJpbmdfbGl0ZXJhbCkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworUXVhbGlmaWVkSURDb250YWluZXIgcXVhbGlmaWVkSURDb250YWluZXIoKSA6Cit7IFF1YWxpZmllZElEQ29udGFpbmVyIHJldFZhbCA9IG51bGw7CisgIFF1YWxpZmllZElEIHF1YWxpZmllZElEID0gbnVsbDsgfQoreworcXVhbGlmaWVkSUQ9cXVhbGlmaWVkSUQoKSAKKyAgeyByZXRWYWwgPSBuZXcgUXVhbGlmaWVkSURDb250YWluZXIocXVhbGlmaWVkSUQpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMoKSA6Cit7IEFubm90YXRpb25zIHJldFZhbCA9IG5ldyBBbm5vdGF0aW9ucygpOworICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBudWxsOyB9Cit7ICggYW5ub3RhdGlvbj1hbm5vdGF0aW9uKCkgeyByZXRWYWwuYWRkQ2hpbGQoYW5ub3RhdGlvbik7IH0gKSogeyByZXR1cm4gcmV0VmFsOyB9IH0KKworQW5ub3RhdGlvbiBhbm5vdGF0aW9uKCkgOgoreyBBbm5vdGF0aW9uIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGF0ID0gbnVsbDsKKyAgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgc291cmNlID0gbnVsbDsKKyAgVG9rZW4gbHBhcmVuID0gbnVsbDsKKyAgS2V5RXF1YWxzVmFsdWVMaXN0IGtleUVxdWFsc1ZhbHVlTGlzdCA9IG51bGw7CisgIFRva2VuIHJwYXJlbiA9IG51bGw7IH0KK3sKK2F0PTxBVD4gc291cmNlPXN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKCkgbHBhcmVuPTxMUEFSRU4+IGtleUVxdWFsc1ZhbHVlTGlzdD1rZXlFcXVhbHNWYWx1ZUxpc3QoKSBycGFyZW49PFJQQVJFTj4gCisgIHsgcmV0VmFsID0gbmV3IEFubm90YXRpb24oY3JlYXRlVG9rZW5JbmZvKGF0KSwgc291cmNlLCBjcmVhdGVUb2tlbkluZm8obHBhcmVuKSwga2V5RXF1YWxzVmFsdWVMaXN0LCBjcmVhdGVUb2tlbkluZm8ocnBhcmVuKSk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitLZXlFcXVhbHNWYWx1ZUxpc3Qga2V5RXF1YWxzVmFsdWVMaXN0KCkgOgoreyBLZXlFcXVhbHNWYWx1ZUxpc3QgcmV0VmFsID0gbmV3IEtleUVxdWFsc1ZhbHVlTGlzdCgpOworICBLZXlFcXVhbHNWYWx1ZSBrdjEgPSBudWxsOworICBUb2tlbiBjb21tYSA9IG51bGw7CisgIEtleUVxdWFsc1ZhbHVlIGt2biA9IG51bGw7IH0KK3sgKCBrdjE9a2V5RXF1YWxzVmFsdWUoKSB7IHJldFZhbC5hZGRDaGlsZChrdjEpOyB9ICkKKyAgKCBjb21tYT08Q09NTUE+IGt2bj1rZXlFcXVhbHNWYWx1ZSgpIHsgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhjb21tYSkpOyByZXRWYWwuYWRkQ2hpbGQoa3ZuKTsgfSApKiB7IHJldHVybiByZXRWYWw7IH0gfQorCitLZXlFcXVhbHNWYWx1ZSBrZXlFcXVhbHNWYWx1ZSgpIDoKK3sgS2V5RXF1YWxzVmFsdWUgcmV0VmFsID0gbnVsbDsKKyAgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQga2V5ID0gbnVsbDsKKyAgVG9rZW4gZXF1YWxzID0gbnVsbDsKKyAgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgdmFsdWUgPSBudWxsOyB9Cit7CitrZXk9c3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKSBlcXVhbHM9PEVRVUFMUz4gdmFsdWU9c3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKSAKKyAgeyByZXRWYWwgPSBuZXcgS2V5RXF1YWxzVmFsdWUoa2V5LCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgdmFsdWUpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworSW1wb3J0U3RtdHMgaW1wb3J0U3RtdHMoKSA6Cit7IEltcG9ydFN0bXRzIHJldFZhbCA9IG5ldyBJbXBvcnRTdG10cygpOworICBJbXBvcnRTdG10IGltcG9ydFN0bXQgPSBudWxsOyB9Cit7ICggaW1wb3J0U3RtdD1pbXBvcnRTdG10KCkgeyByZXRWYWwuYWRkQ2hpbGQoaW1wb3J0U3RtdCk7IH0gKSogeyByZXR1cm4gcmV0VmFsOyB9IH0KKworSW1wb3J0U3RtdCBpbXBvcnRTdG10KCkgOgorCit7IEltcG9ydFN0bXQgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gaW1wb3J0X0tXID0gbnVsbDsKKyAgVG9rZW4gYWxpYXMgPSBudWxsOworICBUb2tlbiBlcXVhbHMgPSBudWxsOworICBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCB1cmkgPSBudWxsOworICBUb2tlbiBzZW1pID0gbnVsbDsgfQoreworaW1wb3J0X0tXPTxJTVBPUlRLVz4gKCBhbGlhcz08SUQ+IGVxdWFscz08RVFVQUxTPiApPyB1cmk9c3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKSBzZW1pPTxTRU1JPiAKKyAgeyByZXRWYWwgPSBuZXcgSW1wb3J0U3RtdChjcmVhdGVUb2tlbkluZm8oaW1wb3J0X0tXKSwgY3JlYXRlVG9rZW5JbmZvKGFsaWFzKSwgY3JlYXRlVG9rZW5JbmZvKGVxdWFscyksIHVyaSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK1RvcExldmVsRGVjbHMgdG9wTGV2ZWxEZWNscygpIDoKK3sgVG9wTGV2ZWxEZWNscyByZXRWYWwgPSBuZXcgVG9wTGV2ZWxEZWNscygpOworICBUb3BMZXZlbERlY2wgdG9wTGV2ZWxEZWNsID0gbnVsbDsgfQoreyAoIHRvcExldmVsRGVjbD10b3BMZXZlbERlY2woKSB7IHJldFZhbC5hZGRDaGlsZCh0b3BMZXZlbERlY2wpOyB9ICkqIHsgcmV0dXJuIHJldFZhbDsgfSB9CisKK1RvcExldmVsRGVjbCB0b3BMZXZlbERlY2woKSA6Cit7IFRvcExldmVsRGVjbCByZXRWYWwgPSBudWxsOworICBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyA9IG51bGw7IH0KK3sKK2Fubm90YXRpb25zPWFubm90YXRpb25zKCkgCisgICggcmV0VmFsPXN1YlBhY2thZ2VEZWNsKGFubm90YXRpb25zKSB7IHJldHVybiByZXRWYWw7IH0KKyAgfCByZXRWYWw9Y2xhc3NEZWNsKGFubm90YXRpb25zKSB7IHJldHVybiByZXRWYWw7IH0KKyAgfCByZXRWYWw9ZGF0YVR5cGVEZWNsKGFubm90YXRpb25zKSB7IHJldHVybiByZXRWYWw7IH0KKyAgfCByZXRWYWw9ZW51bURlY2woYW5ub3RhdGlvbnMpIHsgcmV0dXJuIHJldFZhbDsgfQorICB8IHJldFZhbD1tYXBFbnRyeURlY2woYW5ub3RhdGlvbnMpIHsgcmV0dXJuIHJldFZhbDsgfQorICApCit9CisKK1N1YlBhY2thZ2VEZWNsIHN1YlBhY2thZ2VEZWNsKEFubm90YXRpb25zIGFubm90YXRpb25zKSA6Cit7IFN1YlBhY2thZ2VEZWNsIHJldFZhbCA9IG51bGw7CisgIFRva2VuIHBhY2thZ2VfS1cgPSBudWxsOworICBUb2tlbiBuYW1lID0gbnVsbDsKKyAgVG9rZW4gbGN1cmx5ID0gbnVsbDsKKyAgVG9wTGV2ZWxEZWNscyB0b3BMZXZlbERlY2xzID0gbnVsbDsKKyAgVG9rZW4gcmN1cmx5ID0gbnVsbDsgfQoreworcGFja2FnZV9LVz08UEFDS0FHRUtXPiBuYW1lPTxJRD4gbGN1cmx5PTxMQ1VSTFk+IHRvcExldmVsRGVjbHM9dG9wTGV2ZWxEZWNscygpIHJjdXJseT08UkNVUkxZPiAKKyAgeyByZXRWYWwgPSBuZXcgU3ViUGFja2FnZURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhwYWNrYWdlX0tXKSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8obGN1cmx5KSwgdG9wTGV2ZWxEZWNscywgY3JlYXRlVG9rZW5JbmZvKHJjdXJseSkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworQ2xhc3NEZWNsIGNsYXNzRGVjbChBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucykgOgoreyBDbGFzc0RlY2wgcmV0VmFsID0gbnVsbDsKKyAgQWJzdHJhY3RNb2RpZmllciBhYnN0cmFjdE1vZGlmaWVyID0gbnVsbDsKKyAgQ2xhc3NLaW5kIGNsYXNzS2luZCA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUeXBlUGFyYW1zSW5mbyB0eXBlUGFyYW1zSW5mbyA9IG51bGw7CisgIFRva2VuIGV4dGVuZHNfS1cgPSBudWxsOworICBDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQgc3VwZXJUeXBlcyA9IG51bGw7CisgIFRva2VuIGNvbG9uID0gbnVsbDsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCBpbnN0Q2xhc3NOYW1lID0gbnVsbDsKKyAgVG9rZW4gbGN1cmx5ID0gbnVsbDsKKyAgQ2xhc3NNZW1iZXJEZWNscyBjbGFzc01lbWJlckRlY2xzID0gbnVsbDsKKyAgVG9rZW4gcmN1cmx5ID0gbnVsbDsgfQoreworKCBhYnN0cmFjdE1vZGlmaWVyPWFic3RyYWN0TW9kaWZpZXIoKSApPyBjbGFzc0tpbmQ9Y2xhc3NLaW5kKCkgbmFtZT08SUQ+ICggdHlwZVBhcmFtc0luZm89dHlwZVBhcmFtc0luZm8oKSApPyAoIGV4dGVuZHNfS1c9ImV4dGVuZHMiIHN1cGVyVHlwZXM9Y29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkKCkgKT8gKCBjb2xvbj08Q09MT04+IGluc3RDbGFzc05hbWU9Ym91bmRFeGNlcHRXaWxkY2FyZCgpICk/IGxjdXJseT08TENVUkxZPiBjbGFzc01lbWJlckRlY2xzPWNsYXNzTWVtYmVyRGVjbHMoKSByY3VybHk9PFJDVVJMWT4gCisgIHsgcmV0VmFsID0gbmV3IENsYXNzRGVjbChhbm5vdGF0aW9ucywgYWJzdHJhY3RNb2RpZmllciwgY2xhc3NLaW5kLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIHR5cGVQYXJhbXNJbmZvLCBjcmVhdGVUb2tlbkluZm8oZXh0ZW5kc19LVyksIHN1cGVyVHlwZXMsIGNyZWF0ZVRva2VuSW5mbyhjb2xvbiksIGluc3RDbGFzc05hbWUsIGNyZWF0ZVRva2VuSW5mbyhsY3VybHkpLCBjbGFzc01lbWJlckRlY2xzLCBjcmVhdGVUb2tlbkluZm8ocmN1cmx5KSk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQgY29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkKCkgOgoreyBDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQgcmV0VmFsID0gbmV3IENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCgpOworICBCb3VuZEV4Y2VwdFdpbGRjYXJkIHRiMSA9IG51bGw7CisgIFRva2VuIGNvbW1hID0gbnVsbDsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCB0Ym4gPSBudWxsOyB9Cit7ICggdGIxPWJvdW5kRXhjZXB0V2lsZGNhcmQoKSB7IHJldFZhbC5hZGRDaGlsZCh0YjEpOyB9ICkKKyAgKCBjb21tYT08Q09NTUE+IHRibj1ib3VuZEV4Y2VwdFdpbGRjYXJkKCkgeyByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGNvbW1hKSk7IHJldFZhbC5hZGRDaGlsZCh0Ym4pOyB9ICkqIHsgcmV0dXJuIHJldFZhbDsgfSB9CisKK0Fic3RyYWN0TW9kaWZpZXIgYWJzdHJhY3RNb2RpZmllcigpIDoKK3sgQWJzdHJhY3RNb2RpZmllciByZXRWYWwgPSBudWxsOworICBUb2tlbiBhYnN0cmFjdF9LVyA9IG51bGw7IH0KK3sKK2Fic3RyYWN0X0tXPTxBQlNUUkFDVEtXPiAKKyAgeyByZXRWYWwgPSBuZXcgQWJzdHJhY3RNb2RpZmllcihjcmVhdGVUb2tlbkluZm8oYWJzdHJhY3RfS1cpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK0NsYXNzS2luZCBjbGFzc0tpbmQoKSA6Cit7IFRva2VuIHRvazsgfQoreyB0b2s9PENMQVNTS1c+IHsgcmV0dXJuIG5ldyBDbGFzc0tpbmQgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PElOVEVSRkFDRUtXPiB7IHJldHVybiBuZXcgQ2xhc3NLaW5kIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK30KKworVHlwZVBhcmFtc0luZm8gdHlwZVBhcmFtc0luZm8oKSA6Cit7IFR5cGVQYXJhbXNJbmZvIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGx0ID0gbnVsbDsKKyAgT25lT3JNb3JlVHlwZVBhcmFtcyBvbmVPck1vcmVUeXBlUGFyYW1zID0gbnVsbDsKKyAgVG9rZW4gZ3QgPSBudWxsOyB9Cit7CitsdD08TFQ+IG9uZU9yTW9yZVR5cGVQYXJhbXM9b25lT3JNb3JlVHlwZVBhcmFtcygpIGd0PTxHVD4gCisgIHsgcmV0VmFsID0gbmV3IFR5cGVQYXJhbXNJbmZvKGNyZWF0ZVRva2VuSW5mbyhsdCksIG9uZU9yTW9yZVR5cGVQYXJhbXMsIGNyZWF0ZVRva2VuSW5mbyhndCkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworT25lT3JNb3JlVHlwZVBhcmFtcyBvbmVPck1vcmVUeXBlUGFyYW1zKCkgOgoreyBPbmVPck1vcmVUeXBlUGFyYW1zIHJldFZhbCA9IG5ldyBPbmVPck1vcmVUeXBlUGFyYW1zKCk7CisgIFR5cGVQYXJhbSB0cDEgPSBudWxsOworICBUb2tlbiBjb21tYSA9IG51bGw7CisgIFR5cGVQYXJhbSB0cG4gPSBudWxsOyB9Cit7ICggdHAxPXR5cGVQYXJhbSgpIHsgcmV0VmFsLmFkZENoaWxkKHRwMSk7IH0gKQorICAoIGNvbW1hPTxDT01NQT4gdHBuPXR5cGVQYXJhbSgpIHsgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhjb21tYSkpOyByZXRWYWwuYWRkQ2hpbGQodHBuKTsgfSApKiB7IHJldHVybiByZXRWYWw7IH0gfQorCitUeXBlUGFyYW0gdHlwZVBhcmFtKCkgOgoreyBUeXBlUGFyYW0gcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gdHlwZVZhck5hbWUgPSBudWxsOworICBUeXBlQm91bmRzSW5mbyB0eXBlQm91bmRzSW5mbyA9IG51bGw7IH0KK3sKK3R5cGVWYXJOYW1lPTxJRD4gKCB0eXBlQm91bmRzSW5mbz10eXBlQm91bmRzSW5mbygpICk/IAorICB7IHJldFZhbCA9IG5ldyBUeXBlUGFyYW0oY3JlYXRlVG9rZW5JbmZvKHR5cGVWYXJOYW1lKSwgdHlwZUJvdW5kc0luZm8pOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworVHlwZUJvdW5kc0luZm8gdHlwZUJvdW5kc0luZm8oKSA6Cit7IFR5cGVCb3VuZHNJbmZvIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGV4dGVuZHNfS1cgPSBudWxsOworICBPbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMgb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzID0gbnVsbDsgfQoreworZXh0ZW5kc19LVz08RVhURU5EU0tXPiBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHM9b25lT3JNb3JlVHlwZVBhcmFtQm91bmRzKCkgCisgIHsgcmV0VmFsID0gbmV3IFR5cGVCb3VuZHNJbmZvKGNyZWF0ZVRva2VuSW5mbyhleHRlbmRzX0tXKSwgb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK09uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMoKSA6Cit7IE9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyByZXRWYWwgPSBuZXcgT25lT3JNb3JlVHlwZVBhcmFtQm91bmRzKCk7CisgIEJvdW5kRXhjZXB0V2lsZGNhcmQgdGIxID0gbnVsbDsKKyAgVG9rZW4gYW1wID0gbnVsbDsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCB0Ym4gPSBudWxsOyB9Cit7ICggdGIxPWJvdW5kRXhjZXB0V2lsZGNhcmQoKSB7IHJldFZhbC5hZGRDaGlsZCh0YjEpOyB9ICkKKyAgKCBhbXA9PEFNUD4gdGJuPWJvdW5kRXhjZXB0V2lsZGNhcmQoKSB7IHJldFZhbC5hZGRDaGlsZChjcmVhdGVUb2tlbkluZm8oYW1wKSk7IHJldFZhbC5hZGRDaGlsZCh0Ym4pOyB9ICkqIHsgcmV0dXJuIHJldFZhbDsgfSB9CisKK0JvdW5kRXhjZXB0V2lsZGNhcmQgYm91bmRFeGNlcHRXaWxkY2FyZCgpIDoKK3sgQm91bmRFeGNlcHRXaWxkY2FyZCByZXRWYWwgPSBudWxsOworICBRdWFsaWZpZWRJRCByYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSA9IG51bGw7CisgIFRva2VuIGx0ID0gbnVsbDsKKyAgT25lT3JNb3JlVHlwZUFyZ3Mgb25lT3JNb3JlVHlwZUFyZ3MgPSBudWxsOworICBUb2tlbiBndCA9IG51bGw7IH0KK3sKK3Jhd1ROYW1lT3JUVmFyT3JQYXJhbXplZFROYW1lPXF1YWxpZmllZElEKCkgKCBsdD08TFQ+IG9uZU9yTW9yZVR5cGVBcmdzPW9uZU9yTW9yZVR5cGVBcmdzKCkgZ3Q9PEdUPiApPyAKKyAgeyByZXRWYWwgPSBuZXcgQm91bmRFeGNlcHRXaWxkY2FyZChyYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSwgY3JlYXRlVG9rZW5JbmZvKGx0KSwgb25lT3JNb3JlVHlwZUFyZ3MsIGNyZWF0ZVRva2VuSW5mbyhndCkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworT25lT3JNb3JlVHlwZUFyZ3Mgb25lT3JNb3JlVHlwZUFyZ3MoKSA6Cit7IE9uZU9yTW9yZVR5cGVBcmdzIHJldFZhbCA9IG5ldyBPbmVPck1vcmVUeXBlQXJncygpOworICBUeXBlQXJnIHRhMSA9IG51bGw7CisgIFRva2VuIGNvbW1hID0gbnVsbDsKKyAgVHlwZUFyZyB0YW4gPSBudWxsOyB9Cit7ICggdGExPXR5cGVBcmcoKSB7IHJldFZhbC5hZGRDaGlsZCh0YTEpOyB9ICkKKyAgKCBjb21tYT08Q09NTUE+IHRhbj10eXBlQXJnKCkgeyByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGNvbW1hKSk7IHJldFZhbC5hZGRDaGlsZCh0YW4pOyB9ICkqIHsgcmV0dXJuIHJldFZhbDsgfSB9CisKK1R5cGVBcmcgdHlwZUFyZygpIDoKK3sgVHlwZUFyZyByZXRWYWwgPSBudWxsOyB9Cit7CisgICggcmV0VmFsPWJvdW5kRXhjZXB0V2lsZGNhcmQoKSB7IHJldHVybiByZXRWYWw7IH0KKyAgfCByZXRWYWw9d2lsZGNhcmQoKSB7IHJldHVybiByZXRWYWw7IH0KKyAgKQorfQorCitXaWxkY2FyZCB3aWxkY2FyZCgpIDoKK3sgV2lsZGNhcmQgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gcW1hcmsgPSBudWxsOworICBFeHRlbmRzT3JTdXBlciBleHRlbmRzT3JTdXBlciA9IG51bGw7CisgIEJvdW5kRXhjZXB0V2lsZGNhcmQgYm91bmRFeGNlcHRXaWxkY2FyZCA9IG51bGw7IH0KK3sKK3FtYXJrPTxRTUFSSz4gKCBleHRlbmRzT3JTdXBlcj1leHRlbmRzT3JTdXBlcigpIGJvdW5kRXhjZXB0V2lsZGNhcmQ9Ym91bmRFeGNlcHRXaWxkY2FyZCgpICk/IAorICB7IHJldFZhbCA9IG5ldyBXaWxkY2FyZChjcmVhdGVUb2tlbkluZm8ocW1hcmspLCBleHRlbmRzT3JTdXBlciwgYm91bmRFeGNlcHRXaWxkY2FyZCk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitFeHRlbmRzT3JTdXBlciBleHRlbmRzT3JTdXBlcigpIDoKK3sgVG9rZW4gdG9rOyB9Cit7IHRvaz08RVhURU5EU0tXPiB7IHJldHVybiBuZXcgRXh0ZW5kc09yU3VwZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PFNVUEVSS1c+IHsgcmV0dXJuIG5ldyBFeHRlbmRzT3JTdXBlciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit9CisKK0NsYXNzTWVtYmVyRGVjbHMgY2xhc3NNZW1iZXJEZWNscygpIDoKK3sgQ2xhc3NNZW1iZXJEZWNscyByZXRWYWwgPSBuZXcgQ2xhc3NNZW1iZXJEZWNscygpOworICBDbGFzc01lbWJlckRlY2wgY2xhc3NNZW1iZXJEZWNsID0gbnVsbDsgfQoreyAoIGNsYXNzTWVtYmVyRGVjbD1jbGFzc01lbWJlckRlY2woKSB7IHJldFZhbC5hZGRDaGlsZChjbGFzc01lbWJlckRlY2wpOyB9ICkqIHsgcmV0dXJuIHJldFZhbDsgfSB9CisKK0NsYXNzTWVtYmVyRGVjbCBjbGFzc01lbWJlckRlY2woKSA6Cit7IENsYXNzTWVtYmVyRGVjbCByZXRWYWwgPSBudWxsOworICBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyA9IG51bGw7CisgIE1vZGlmaWVycyBtb2RpZmllcnMgPSBudWxsOyB9Cit7Cithbm5vdGF0aW9ucz1hbm5vdGF0aW9ucygpIG1vZGlmaWVycz1tb2RpZmllcnMoKSAKKyAgKCByZXRWYWw9YXR0cmlidXRlKGFubm90YXRpb25zLCBtb2RpZmllcnMpIHsgcmV0dXJuIHJldFZhbDsgfQorICB8IHJldFZhbD1yZWZlcmVuY2UoYW5ub3RhdGlvbnMsIG1vZGlmaWVycykgeyByZXR1cm4gcmV0VmFsOyB9CisgIHwgcmV0VmFsPW9wZXJhdGlvbihhbm5vdGF0aW9ucywgbW9kaWZpZXJzKSB7IHJldHVybiByZXRWYWw7IH0KKyAgKQorfQorCitBdHRyaWJ1dGUgYXR0cmlidXRlKEFubm90YXRpb25zIGFubm90YXRpb25zLCBNb2RpZmllcnMgbW9kaWZpZXJzKSA6Cit7IEF0dHJpYnV0ZSByZXRWYWwgPSBudWxsOworICBUb2tlbiBhdHRyX0tXID0gbnVsbDsKKyAgVHlwZVdpdGhNdWx0aSB0eXBlV2l0aE11bHRpID0gbnVsbDsKKyAgVG9rZW4gbmFtZSA9IG51bGw7CisgIFRva2VuIGVxdWFscyA9IG51bGw7CisgIERlZmF1bHRWYWx1ZUV4cHIgZGVmYXVsdFZhbHVlRXhwciA9IG51bGw7CisgIFRva2VuIHNlbWkgPSBudWxsOyB9Cit7CithdHRyX0tXPTxBVFRSS1c+IHR5cGVXaXRoTXVsdGk9dHlwZVdpdGhNdWx0aSgpIG5hbWU9PElEPiAoIGVxdWFscz08RVFVQUxTPiBkZWZhdWx0VmFsdWVFeHByPWRlZmF1bHRWYWx1ZUV4cHIoKSApPyBzZW1pPTxTRU1JPiAKKyAgeyByZXRWYWwgPSBuZXcgQXR0cmlidXRlKGFubm90YXRpb25zLCBtb2RpZmllcnMsIGNyZWF0ZVRva2VuSW5mbyhhdHRyX0tXKSwgdHlwZVdpdGhNdWx0aSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgZGVmYXVsdFZhbHVlRXhwciwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK1R5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSgpIDoKK3sgVHlwZVdpdGhNdWx0aSByZXRWYWwgPSBudWxsOworICBCb3VuZEV4Y2VwdFdpbGRjYXJkIG5hbWUgPSBudWxsOworICBNdWx0aXBsaWNpdHkgbXVsdGlwbGljaXR5ID0gbnVsbDsgfQoreworbmFtZT1ib3VuZEV4Y2VwdFdpbGRjYXJkKCkgKCBtdWx0aXBsaWNpdHk9bXVsdGlwbGljaXR5KCkgKT8gCisgIHsgcmV0VmFsID0gbmV3IFR5cGVXaXRoTXVsdGkobmFtZSwgbXVsdGlwbGljaXR5KTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK011bHRpcGxpY2l0eSBtdWx0aXBsaWNpdHkoKSA6Cit7IE11bHRpcGxpY2l0eSByZXRWYWwgPSBudWxsOworICBUb2tlbiBsc3F1YXJlID0gbnVsbDsKKyAgTXVsdGlwbGljaXR5RXhwciBtdWx0aXBsaWNpdHlFeHByID0gbnVsbDsKKyAgVG9rZW4gcnNxdWFyZSA9IG51bGw7IH0KK3sKK2xzcXVhcmU9PExTUVVBUkU+ICggbXVsdGlwbGljaXR5RXhwcj1tdWx0aXBsaWNpdHlFeHByKCkgKT8gcnNxdWFyZT08UlNRVUFSRT4gCisgIHsgcmV0VmFsID0gbmV3IE11bHRpcGxpY2l0eShjcmVhdGVUb2tlbkluZm8obHNxdWFyZSksIG11bHRpcGxpY2l0eUV4cHIsIGNyZWF0ZVRva2VuSW5mbyhyc3F1YXJlKSk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitNdWx0aXBsaWNpdHlFeHByIG11bHRpcGxpY2l0eUV4cHIoKSA6Cit7IE11bHRpcGxpY2l0eUV4cHIgcmV0VmFsID0gbnVsbDsKKyAgU2ltcGxlTXVsdGlwbGljaXR5RXhwciBsb3dlckJvdW5kID0gbnVsbDsKKyAgVG9rZW4gZG90X2RvdCA9IG51bGw7CisgIFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgdXBwZXJCb3VuZCA9IG51bGw7IH0KK3sKK2xvd2VyQm91bmQ9c2ltcGxlTXVsdGlwbGljaXR5RXhwcigpICggZG90X2RvdD08RE9UX0RPVD4gdXBwZXJCb3VuZD1zaW1wbGVNdWx0aXBsaWNpdHlFeHByKCkgKT8gCisgIHsgcmV0VmFsID0gbmV3IE11bHRpcGxpY2l0eUV4cHIobG93ZXJCb3VuZCwgY3JlYXRlVG9rZW5JbmZvKGRvdF9kb3QpLCB1cHBlckJvdW5kKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK1NpbXBsZU11bHRpcGxpY2l0eUV4cHIgc2ltcGxlTXVsdGlwbGljaXR5RXhwcigpIDoKK3sgVG9rZW4gdG9rOyB9Cit7IHRvaz08U1RBUj4geyByZXR1cm4gbmV3IFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PFBMVVM+IHsgcmV0dXJuIG5ldyBTaW1wbGVNdWx0aXBsaWNpdHlFeHByIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK3wgdG9rPTxRTUFSSz4geyByZXR1cm4gbmV3IFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PElOVF9MSVRFUkFMPiB7IHJldHVybiBuZXcgU2ltcGxlTXVsdGlwbGljaXR5RXhwciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit9CisKK1JlZmVyZW5jZSByZWZlcmVuY2UoQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMsIE1vZGlmaWVycyBtb2RpZmllcnMpIDoKK3sgUmVmZXJlbmNlIHJldFZhbCA9IG51bGw7CisgIFJlZmVyZW5jZUtpbmQgcmVmZXJlbmNlS2luZCA9IG51bGw7CisgIFR5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSA9IG51bGw7CisgIFRva2VuIGhhc2ggPSBudWxsOworICBUb2tlbiBvcHBvc2l0ZU5hbWUgPSBudWxsOworICBUb2tlbiBuYW1lID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7IH0KK3sKK3JlZmVyZW5jZUtpbmQ9cmVmZXJlbmNlS2luZCgpIHR5cGVXaXRoTXVsdGk9dHlwZVdpdGhNdWx0aSgpICggaGFzaD08SEFTSD4gb3Bwb3NpdGVOYW1lPTxJRD4gKT8gbmFtZT08SUQ+IHNlbWk9PFNFTUk+IAorICB7IHJldFZhbCA9IG5ldyBSZWZlcmVuY2UoYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgcmVmZXJlbmNlS2luZCwgdHlwZVdpdGhNdWx0aSwgY3JlYXRlVG9rZW5JbmZvKGhhc2gpLCBjcmVhdGVUb2tlbkluZm8ob3Bwb3NpdGVOYW1lKSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oc2VtaSkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworUmVmZXJlbmNlS2luZCByZWZlcmVuY2VLaW5kKCkgOgoreyBUb2tlbiB0b2s7IH0KK3sgdG9rPTxSRUZLVz4geyByZXR1cm4gbmV3IFJlZmVyZW5jZUtpbmQgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PFZBTEtXPiB7IHJldHVybiBuZXcgUmVmZXJlbmNlS2luZCAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit9CisKK01vZGlmaWVycyBtb2RpZmllcnMoKSA6Cit7IE1vZGlmaWVycyByZXRWYWwgPSBuZXcgTW9kaWZpZXJzKCk7CisgIE9wdE5lZ2F0ZWRNb2RpZmllciBvcHROZWdhdGVkTW9kaWZpZXIgPSBudWxsOyB9Cit7ICggb3B0TmVnYXRlZE1vZGlmaWVyPW9wdE5lZ2F0ZWRNb2RpZmllcigpIHsgcmV0VmFsLmFkZENoaWxkKG9wdE5lZ2F0ZWRNb2RpZmllcik7IH0gKSogeyByZXR1cm4gcmV0VmFsOyB9IH0KKworT3B0TmVnYXRlZE1vZGlmaWVyIG9wdE5lZ2F0ZWRNb2RpZmllcigpIDoKK3sgT3B0TmVnYXRlZE1vZGlmaWVyIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGJhbmcgPSBudWxsOworICBNb2RpZmllciBtb2RpZmllciA9IG51bGw7IH0KK3sKKyggYmFuZz08QkFORz4gKT8gbW9kaWZpZXI9bW9kaWZpZXIoKSAKKyAgeyByZXRWYWwgPSBuZXcgT3B0TmVnYXRlZE1vZGlmaWVyKGNyZWF0ZVRva2VuSW5mbyhiYW5nKSwgbW9kaWZpZXIpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworTW9kaWZpZXIgbW9kaWZpZXIoKSA6Cit7IFRva2VuIHRvazsgfQoreyB0b2s9PFJFQURPTkxZS1c+IHsgcmV0dXJuIG5ldyBNb2RpZmllciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit8IHRvaz08Vk9MQVRJTEVLVz4geyByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK3wgdG9rPTxUUkFOU0lFTlRLVz4geyByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK3wgdG9rPTxVTlNFVFRBQkxFS1c+IHsgcmV0dXJuIG5ldyBNb2RpZmllciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit8IHRvaz08REVSSVZFREtXPiB7IHJldHVybiBuZXcgTW9kaWZpZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PFVOSVFVRUtXPiB7IHJldHVybiBuZXcgTW9kaWZpZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfCB0b2s9PE9SREVSRURLVz4geyByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK3wgdG9rPTxSRVNPTFZFS1c+IHsgcmV0dXJuIG5ldyBNb2RpZmllciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpOyB9Cit8IHRvaz08SURLVz4geyByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK30KKworRGVmYXVsdFZhbHVlRXhwciBkZWZhdWx0VmFsdWVFeHByKCkgOgoreyBEZWZhdWx0VmFsdWVFeHByIHJldFZhbCA9IG51bGw7IH0KK3sKKyAgKCByZXRWYWw9Ym9vbEV4cHIoKSB7IHJldHVybiByZXRWYWw7IH0KKyAgfCByZXRWYWw9aW50RXhwcigpIHsgcmV0dXJuIHJldFZhbDsgfQorICB8IHJldFZhbD1zdHJpbmdFeHByKCkgeyByZXR1cm4gcmV0VmFsOyB9CisgIHwgcmV0VmFsPWNoYXJFeHByKCkgeyByZXR1cm4gcmV0VmFsOyB9CisgICkKK30KKworQm9vbEV4cHIgYm9vbEV4cHIoKSA6Cit7IEJvb2xFeHByIHJldFZhbCA9IG51bGw7CisgIFRydWVPckZhbHNlIHRydWVPckZhbHNlID0gbnVsbDsgfQorewordHJ1ZU9yRmFsc2U9dHJ1ZU9yRmFsc2UoKSAKKyAgeyByZXRWYWwgPSBuZXcgQm9vbEV4cHIodHJ1ZU9yRmFsc2UpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworVHJ1ZU9yRmFsc2UgdHJ1ZU9yRmFsc2UoKSA6Cit7IFRva2VuIHRvazsgfQoreyB0b2s9PFRSVUVLVz4geyByZXR1cm4gbmV3IFRydWVPckZhbHNlIChjcmVhdGVUb2tlbkluZm8odG9rKSk7IH0KK3wgdG9rPTxGQUxTRUtXPiB7IHJldHVybiBuZXcgVHJ1ZU9yRmFsc2UgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTsgfQorfQorCitJbnRFeHByIGludEV4cHIoKSA6Cit7IEludEV4cHIgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gbWludXMgPSBudWxsOworICBUb2tlbiBpbnRfbGl0ZXJhbCA9IG51bGw7IH0KK3sKKyggbWludXM9PE1JTlVTPiApPyBpbnRfbGl0ZXJhbD08SU5UX0xJVEVSQUw+IAorICB7IHJldFZhbCA9IG5ldyBJbnRFeHByKGNyZWF0ZVRva2VuSW5mbyhtaW51cyksIGNyZWF0ZVRva2VuSW5mbyhpbnRfbGl0ZXJhbCkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworU3RyaW5nRXhwciBzdHJpbmdFeHByKCkgOgoreyBTdHJpbmdFeHByIHJldFZhbCA9IG51bGw7CisgIFRva2VuIHN0cmluZ19saXRlcmFsID0gbnVsbDsgfQoreworc3RyaW5nX2xpdGVyYWw9PFNUUklOR19MSVRFUkFMPiAKKyAgeyByZXRWYWwgPSBuZXcgU3RyaW5nRXhwcihjcmVhdGVUb2tlbkluZm8oc3RyaW5nX2xpdGVyYWwpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK0NoYXJFeHByIGNoYXJFeHByKCkgOgoreyBDaGFyRXhwciByZXRWYWwgPSBudWxsOworICBUb2tlbiBjaGFyX2xpdGVyYWwgPSBudWxsOyB9Cit7CitjaGFyX2xpdGVyYWw9PENIQVJfTElURVJBTD4gCisgIHsgcmV0VmFsID0gbmV3IENoYXJFeHByKGNyZWF0ZVRva2VuSW5mbyhjaGFyX2xpdGVyYWwpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK09wZXJhdGlvbiBvcGVyYXRpb24oQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMsIE1vZGlmaWVycyBtb2RpZmllcnMpIDoKK3sgT3BlcmF0aW9uIHJldFZhbCA9IG51bGw7CisgIFRva2VuIG9wX0tXID0gbnVsbDsKKyAgVHlwZVBhcmFtc0luZm8gdHlwZVBhcmFtc0luZm8gPSBudWxsOworICBSZXN1bHRUeXBlIHJlc1R5cGUgPSBudWxsOworICBUb2tlbiBuYW1lID0gbnVsbDsKKyAgVG9rZW4gbHBhcmVuID0gbnVsbDsKKyAgUGFyYW1zIHBhcmFtcyA9IG51bGw7CisgIFRva2VuIHJwYXJlbiA9IG51bGw7CisgIFRva2VuIHRocm93c19LVyA9IG51bGw7CisgIENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBleGNlcHRpb25zID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7IH0KK3sKK29wX0tXPTxPUEtXPiAoIHR5cGVQYXJhbXNJbmZvPXR5cGVQYXJhbXNJbmZvKCkgKT8gcmVzVHlwZT1yZXN1bHRUeXBlKCkgbmFtZT08SUQ+IGxwYXJlbj08TFBBUkVOPiAoIHBhcmFtcz1wYXJhbXMoKSApPyBycGFyZW49PFJQQVJFTj4gKCB0aHJvd3NfS1c9PFRIUk9XU0tXPiBleGNlcHRpb25zPWNvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCgpICk/IHNlbWk9PFNFTUk+IAorICB7IHJldFZhbCA9IG5ldyBPcGVyYXRpb24oYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgY3JlYXRlVG9rZW5JbmZvKG9wX0tXKSwgdHlwZVBhcmFtc0luZm8sIHJlc1R5cGUsIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGxwYXJlbiksIHBhcmFtcywgY3JlYXRlVG9rZW5JbmZvKHJwYXJlbiksIGNyZWF0ZVRva2VuSW5mbyh0aHJvd3NfS1cpLCBleGNlcHRpb25zLCBjcmVhdGVUb2tlbkluZm8oc2VtaSkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworUmVzdWx0VHlwZSByZXN1bHRUeXBlKCkgOgoreyBSZXN1bHRUeXBlIHJldFZhbCA9IG51bGw7IH0KK3sKKyAgKCByZXRWYWw9dHlwZVdpdGhNdWx0aSgpIHsgcmV0dXJuIHJldFZhbDsgfQorICB8IHJldFZhbD12b2lkQ29udGFpbmVyKCkgeyByZXR1cm4gcmV0VmFsOyB9CisgICkKK30KKworVm9pZENvbnRhaW5lciB2b2lkQ29udGFpbmVyKCkgOgoreyBWb2lkQ29udGFpbmVyIHJldFZhbCA9IG51bGw7CisgIFRva2VuIHZvaWRfS1cgPSBudWxsOyB9Cit7Cit2b2lkX0tXPTxWT0lES1c+IAorICB7IHJldFZhbCA9IG5ldyBWb2lkQ29udGFpbmVyKGNyZWF0ZVRva2VuSW5mbyh2b2lkX0tXKSk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitQYXJhbXMgcGFyYW1zKCkgOgoreyBQYXJhbXMgcmV0VmFsID0gbmV3IFBhcmFtcygpOworICBQYXJhbSBwMSA9IG51bGw7CisgIFRva2VuIGNvbW1hID0gbnVsbDsKKyAgUGFyYW0gcG4gPSBudWxsOyB9Cit7ICggcDE9cGFyYW0oKSB7IHJldFZhbC5hZGRDaGlsZChwMSk7IH0gKQorICAoIGNvbW1hPTxDT01NQT4gcG49cGFyYW0oKSB7IHJldFZhbC5hZGRDaGlsZChjcmVhdGVUb2tlbkluZm8oY29tbWEpKTsgcmV0VmFsLmFkZENoaWxkKHBuKTsgfSApKiB7IHJldHVybiByZXRWYWw7IH0gfQorCitQYXJhbSBwYXJhbSgpIDoKK3sgUGFyYW0gcmV0VmFsID0gbnVsbDsKKyAgQW5ub3RhdGlvbnMgbGVhZGluZ0Fubm90YXRpb25zID0gbnVsbDsKKyAgTW9kaWZpZXJzIG1vZGlmaWVycyA9IG51bGw7CisgIFR5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBBbm5vdGF0aW9ucyB0cmFpbGluZ0Fubm90YXRpb25zID0gbnVsbDsgfQoreworbGVhZGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zKCkgbW9kaWZpZXJzPW1vZGlmaWVycygpIHR5cGVXaXRoTXVsdGk9dHlwZVdpdGhNdWx0aSgpIG5hbWU9PElEPiB0cmFpbGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zKCkgCisgIHsgcmV0VmFsID0gbmV3IFBhcmFtKGxlYWRpbmdBbm5vdGF0aW9ucywgbW9kaWZpZXJzLCB0eXBlV2l0aE11bHRpLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIHRyYWlsaW5nQW5ub3RhdGlvbnMpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworRGF0YVR5cGVEZWNsIGRhdGFUeXBlRGVjbChBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucykgOgoreyBEYXRhVHlwZURlY2wgcmV0VmFsID0gbnVsbDsKKyAgVHJhbnNpZW50TW9kaWZpZXIgdHJhbnNpZW50TW9kaWZpZXIgPSBudWxsOworICBUb2tlbiBkYXRhdHlwZV9LVyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBjb2xvbiA9IG51bGw7CisgIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIGluc3RDbGFzc05hbWUgPSBudWxsOworICBUb2tlbiBzZW1pID0gbnVsbDsgfQoreworKCB0cmFuc2llbnRNb2RpZmllcj10cmFuc2llbnRNb2RpZmllcigpICk/IGRhdGF0eXBlX0tXPTxEQVRBVFlQRUtXPiBuYW1lPTxJRD4gY29sb249PENPTE9OPiBpbnN0Q2xhc3NOYW1lPXN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKCkgc2VtaT08U0VNST4gCisgIHsgcmV0VmFsID0gbmV3IERhdGFUeXBlRGVjbChhbm5vdGF0aW9ucywgdHJhbnNpZW50TW9kaWZpZXIsIGNyZWF0ZVRva2VuSW5mbyhkYXRhdHlwZV9LVyksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGNvbG9uKSwgaW5zdENsYXNzTmFtZSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKK1RyYW5zaWVudE1vZGlmaWVyIHRyYW5zaWVudE1vZGlmaWVyKCkgOgoreyBUcmFuc2llbnRNb2RpZmllciByZXRWYWwgPSBudWxsOworICBUb2tlbiB0cmFuc2llbnRfS1cgPSBudWxsOyB9Cit7Cit0cmFuc2llbnRfS1c9PFRSQU5TSUVOVEtXPiAKKyAgeyByZXRWYWwgPSBuZXcgVHJhbnNpZW50TW9kaWZpZXIoY3JlYXRlVG9rZW5JbmZvKHRyYW5zaWVudF9LVykpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworRW51bURlY2wgZW51bURlY2woQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMpIDoKK3sgRW51bURlY2wgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gZW51bV9LVyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBsY3VybHkgPSBudWxsOworICBFbnVtTGl0ZXJhbHMgZW51bUxpdGVyYWxzID0gbnVsbDsKKyAgVG9rZW4gcmN1cmx5ID0gbnVsbDsgfQoreworZW51bV9LVz08RU5VTUtXPiBuYW1lPTxJRD4gbGN1cmx5PTxMQ1VSTFk+IGVudW1MaXRlcmFscz1lbnVtTGl0ZXJhbHMoKSByY3VybHk9PFJDVVJMWT4gCisgIHsgcmV0VmFsID0gbmV3IEVudW1EZWNsKGFubm90YXRpb25zLCBjcmVhdGVUb2tlbkluZm8oZW51bV9LVyksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGxjdXJseSksIGVudW1MaXRlcmFscywgY3JlYXRlVG9rZW5JbmZvKHJjdXJseSkpOworICAgIHJldHVybiByZXRWYWw7IH0KK30KKworRW51bUxpdGVyYWxzIGVudW1MaXRlcmFscygpIDoKK3sgRW51bUxpdGVyYWxzIHJldFZhbCA9IG5ldyBFbnVtTGl0ZXJhbHMoKTsKKyAgRW51bUxpdGVyYWwgZW51bUxpdGVyYWwgPSBudWxsOyB9Cit7ICggZW51bUxpdGVyYWw9ZW51bUxpdGVyYWwoKSB7IHJldFZhbC5hZGRDaGlsZChlbnVtTGl0ZXJhbCk7IH0gKSogeyByZXR1cm4gcmV0VmFsOyB9IH0KKworRW51bUxpdGVyYWwgZW51bUxpdGVyYWwoKSA6Cit7IEVudW1MaXRlcmFsIHJldFZhbCA9IG51bGw7CisgIEFubm90YXRpb25zIGxlYWRpbmdBbm5vdGF0aW9ucyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBlcXVhbHMgPSBudWxsOworICBUb2tlbiB2YWwgPSBudWxsOworICBBbm5vdGF0aW9ucyB0cmFpbGluZ0Fubm90YXRpb25zID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7IH0KK3sKK2xlYWRpbmdBbm5vdGF0aW9ucz1hbm5vdGF0aW9ucygpIG5hbWU9PElEPiAoIGVxdWFscz08RVFVQUxTPiB2YWw9PElOVF9MSVRFUkFMPiApPyB0cmFpbGluZ0Fubm90YXRpb25zPWFubm90YXRpb25zKCkgc2VtaT08U0VNST4gCisgIHsgcmV0VmFsID0gbmV3IEVudW1MaXRlcmFsKGxlYWRpbmdBbm5vdGF0aW9ucywgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgY3JlYXRlVG9rZW5JbmZvKHZhbCksIHRyYWlsaW5nQW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisgICAgcmV0dXJuIHJldFZhbDsgfQorfQorCitNYXBFbnRyeURlY2wgbWFwRW50cnlEZWNsKEFubm90YXRpb25zIGFubm90YXRpb25zKSA6Cit7IE1hcEVudHJ5RGVjbCByZXRWYWwgPSBudWxsOworICBUb2tlbiBtYXBlbnRyeV9LVyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBjb2xvbiA9IG51bGw7CisgIFR5cGVXaXRoTXVsdGkga2V5ID0gbnVsbDsKKyAgVG9rZW4gbWludXNfZ3QgPSBudWxsOworICBUeXBlV2l0aE11bHRpIHZhbHVlID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7IH0KK3sKK21hcGVudHJ5X0tXPTxNQVBFTlRSWUtXPiBuYW1lPTxJRD4gY29sb249PENPTE9OPiBrZXk9dHlwZVdpdGhNdWx0aSgpIG1pbnVzX2d0PTxNSU5VU19HVD4gdmFsdWU9dHlwZVdpdGhNdWx0aSgpIHNlbWk9PFNFTUk+IAorICB7IHJldFZhbCA9IG5ldyBNYXBFbnRyeURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhtYXBlbnRyeV9LVyksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGNvbG9uKSwga2V5LCBjcmVhdGVUb2tlbkluZm8obWludXNfZ3QpLCB2YWx1ZSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKyAgICByZXR1cm4gcmV0VmFsOyB9Cit9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9wYXJzZXIvRW1mYXRpY1BhcnNlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL3BhcnNlci9FbWZhdGljUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiMjY5NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9wYXJzZXIvRW1mYXRpY1BhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjkzMSBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBFbWZhdGljUGFyc2VyLmphdmEgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5BYnN0cmFjdE1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQW5ub3RhdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkJvb2xFeHByOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkJvdW5kRXhjZXB0V2lsZGNhcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQ2hhckV4cHI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQ2xhc3NEZWNsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkNsYXNzS2luZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5DbGFzc01lbWJlckRlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQ2xhc3NNZW1iZXJEZWNsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Db21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQ29tcFVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRGF0YVR5cGVEZWNsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkRlZmF1bHRWYWx1ZUV4cHI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW51bURlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW51bUxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW51bUxpdGVyYWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkV4dGVuZHNPclN1cGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkltcG9ydFN0bXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuSW1wb3J0U3RtdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuSW50RXhwcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5LZXlFcXVhbHNWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5LZXlFcXVhbHNWYWx1ZUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuTWFwRW50cnlEZWNsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0Lk1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0Lk1vZGlmaWVyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5NdWx0aXBsaWNpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuTXVsdGlwbGljaXR5RXhwcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5PbmVPck1vcmVUeXBlQXJnczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5PbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuT25lT3JNb3JlVHlwZVBhcmFtczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5PcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuT3B0TmVnYXRlZE1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlBhY2thZ2VEZWNsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlBhcmFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlBhcmFtczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5RaWRTZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuUXVhbGlmaWVkSUQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuUXVhbGlmaWVkSURDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlJlZmVyZW5jZUtpbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuUmVzdWx0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5TaW1wbGVNdWx0aXBsaWNpdHlFeHByOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlN0cmluZ0V4cHI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuU3RyaW5nTGl0ZXJhbENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5TdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5TdWJQYWNrYWdlRGVjbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Ub3BMZXZlbERlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuVG9wTGV2ZWxEZWNsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5UcmFuc2llbnRNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5UcnVlT3JGYWxzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5UeXBlQXJnOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlR5cGVCb3VuZHNJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlR5cGVQYXJhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5UeXBlUGFyYW1zSW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5UeXBlV2l0aE11bHRpOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlZvaWRDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuV2lsZGNhcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LlRva2VuSW5mbzsKKworcHVibGljIGNsYXNzIEVtZmF0aWNQYXJzZXIgaW1wbGVtZW50cyBFbWZhdGljUGFyc2VyQ29uc3RhbnRzIHsKKworICBwdWJsaWMgVG9rZW5JbmZvIGNyZWF0ZVRva2VuSW5mbyhUb2tlbiB0b2spIHsKKyAgICBpZiAoISh0b2sgaW5zdGFuY2VvZiBFeHRUb2tlbikpIHJldHVybiBudWxsOworCisgICAgRXh0VG9rZW4gZXh0VG9rZW4gPSAoRXh0VG9rZW4pIHRvazsKKyAgICByZXR1cm4gbmV3IFRva2VuSW5mbyh0b2suaW1hZ2UsIGV4dFRva2VuLnRva2VuT2Zmc2V0LCB0b2sua2luZCk7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQ29tcFVuaXQgY29tcFVuaXQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBDb21wVW5pdCByZXRWYWwgPSBudWxsOworICBQYWNrYWdlRGVjbCBwYWNrYWdlRGVjbCA9IG51bGw7CisgIEltcG9ydFN0bXRzIGltcG9ydFN0bXRzID0gbnVsbDsKKyAgVG9wTGV2ZWxEZWNscyB0b3BMZXZlbERlY2xzID0gbnVsbDsKKyAgICBwYWNrYWdlRGVjbCA9IHBhY2thZ2VEZWNsKCk7CisgICAgaW1wb3J0U3RtdHMgPSBpbXBvcnRTdG10cygpOworICAgIHRvcExldmVsRGVjbHMgPSB0b3BMZXZlbERlY2xzKCk7CisgICAgampfY29uc3VtZV90b2tlbigwKTsKKyAgICByZXRWYWwgPSBuZXcgQ29tcFVuaXQocGFja2FnZURlY2wsIGltcG9ydFN0bXRzLCB0b3BMZXZlbERlY2xzKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgUGFja2FnZURlY2wgcGFja2FnZURlY2woKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBQYWNrYWdlRGVjbCByZXRWYWwgPSBudWxsOworICBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyA9IG51bGw7CisgIFRva2VuIHBhY2thZ2VfS1cgPSBudWxsOworICBRdWFsaWZpZWRJRCBuYW1lID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7CisgICAgYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucygpOworICAgIHBhY2thZ2VfS1cgPSBqal9jb25zdW1lX3Rva2VuKFBBQ0tBR0VLVyk7CisgICAgbmFtZSA9IHF1YWxpZmllZElEKCk7CisgICAgc2VtaSA9IGpqX2NvbnN1bWVfdG9rZW4oU0VNSSk7CisgICAgcmV0VmFsID0gbmV3IFBhY2thZ2VEZWNsKGFubm90YXRpb25zLCBjcmVhdGVUb2tlbkluZm8ocGFja2FnZV9LVyksIG5hbWUsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFF1YWxpZmllZElEIHF1YWxpZmllZElEKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgUXVhbGlmaWVkSUQgcmV0VmFsID0gbmV3IFF1YWxpZmllZElEKCk7CisgIFRva2VuIGlkMSA9IG51bGw7CisgIFFpZFNlcGFyYXRvciBxaWRTZXBhcmF0b3IgPSBudWxsOworICBUb2tlbiBpZG4gPSBudWxsOworICAgIGlkMSA9IGpqX2NvbnN1bWVfdG9rZW4oSUQpOworICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhpZDEpKTsKKyAgICBsYWJlbF8xOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoampfMl8xKDQpKSB7CisgICAgICAgIDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrIGxhYmVsXzE7CisgICAgICB9CisgICAgICBxaWRTZXBhcmF0b3IgPSBxaWRTZXBhcmF0b3IoKTsKKyAgICAgIGlkbiA9IGpqX2NvbnN1bWVfdG9rZW4oSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5hZGRDaGlsZChxaWRTZXBhcmF0b3IpOyByZXRWYWwuYWRkQ2hpbGQoY3JlYXRlVG9rZW5JbmZvKGlkbikpOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBRaWRTZXBhcmF0b3IgcWlkU2VwYXJhdG9yKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgVG9rZW4gdG9rOworICAgIGlmIChqal8yXzIoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oRE9UKTsKKyAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IFFpZFNlcGFyYXRvciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfMyg0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihET0xMQVIpOworICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgUWlkU2VwYXJhdG9yIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIHN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgcmV0VmFsID0gbnVsbDsKKyAgICBpZiAoampfMl80KDQpKSB7CisgICAgICByZXRWYWwgPSBzdHJpbmdMaXRlcmFsQ29udGFpbmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgfSBlbHNlIGlmIChqal8yXzUoNCkpIHsKKyAgICAgIHJldFZhbCA9IHF1YWxpZmllZElEQ29udGFpbmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIH0gZWxzZSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFN0cmluZ0xpdGVyYWxDb250YWluZXIgc3RyaW5nTGl0ZXJhbENvbnRhaW5lcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFN0cmluZ0xpdGVyYWxDb250YWluZXIgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gc3RyaW5nX2xpdGVyYWwgPSBudWxsOworICAgIHN0cmluZ19saXRlcmFsID0gampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7CisgICAgcmV0VmFsID0gbmV3IFN0cmluZ0xpdGVyYWxDb250YWluZXIoY3JlYXRlVG9rZW5JbmZvKHN0cmluZ19saXRlcmFsKSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFF1YWxpZmllZElEQ29udGFpbmVyIHF1YWxpZmllZElEQ29udGFpbmVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgUXVhbGlmaWVkSURDb250YWluZXIgcmV0VmFsID0gbnVsbDsKKyAgUXVhbGlmaWVkSUQgcXVhbGlmaWVkSUQgPSBudWxsOworICAgIHF1YWxpZmllZElEID0gcXVhbGlmaWVkSUQoKTsKKyAgICByZXRWYWwgPSBuZXcgUXVhbGlmaWVkSURDb250YWluZXIocXVhbGlmaWVkSUQpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIEFubm90YXRpb25zIHJldFZhbCA9IG5ldyBBbm5vdGF0aW9ucygpOworICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBudWxsOworICAgIGxhYmVsXzI6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChqal8yXzYoNCkpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfMjsKKyAgICAgIH0KKyAgICAgIGFubm90YXRpb24gPSBhbm5vdGF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQoYW5ub3RhdGlvbik7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEFubm90YXRpb24gYW5ub3RhdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIEFubm90YXRpb24gcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gYXQgPSBudWxsOworICBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCBzb3VyY2UgPSBudWxsOworICBUb2tlbiBscGFyZW4gPSBudWxsOworICBLZXlFcXVhbHNWYWx1ZUxpc3Qga2V5RXF1YWxzVmFsdWVMaXN0ID0gbnVsbDsKKyAgVG9rZW4gcnBhcmVuID0gbnVsbDsKKyAgICBhdCA9IGpqX2NvbnN1bWVfdG9rZW4oQVQpOworICAgIHNvdXJjZSA9IHN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKCk7CisgICAgbHBhcmVuID0gampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgIGtleUVxdWFsc1ZhbHVlTGlzdCA9IGtleUVxdWFsc1ZhbHVlTGlzdCgpOworICAgIHJwYXJlbiA9IGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKKyAgICByZXRWYWwgPSBuZXcgQW5ub3RhdGlvbihjcmVhdGVUb2tlbkluZm8oYXQpLCBzb3VyY2UsIGNyZWF0ZVRva2VuSW5mbyhscGFyZW4pLCBrZXlFcXVhbHNWYWx1ZUxpc3QsIGNyZWF0ZVRva2VuSW5mbyhycGFyZW4pKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgS2V5RXF1YWxzVmFsdWVMaXN0IGtleUVxdWFsc1ZhbHVlTGlzdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIEtleUVxdWFsc1ZhbHVlTGlzdCByZXRWYWwgPSBuZXcgS2V5RXF1YWxzVmFsdWVMaXN0KCk7CisgIEtleUVxdWFsc1ZhbHVlIGt2MSA9IG51bGw7CisgIFRva2VuIGNvbW1hID0gbnVsbDsKKyAgS2V5RXF1YWxzVmFsdWUga3ZuID0gbnVsbDsKKyAgICBrdjEgPSBrZXlFcXVhbHNWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKGt2MSk7CisgICAgbGFiZWxfMzoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfNyg0KSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF8zOworICAgICAgfQorICAgICAgY29tbWEgPSBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKKyAgICAgIGt2biA9IGtleUVxdWFsc1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5hZGRDaGlsZChjcmVhdGVUb2tlbkluZm8oY29tbWEpKTsgcmV0VmFsLmFkZENoaWxkKGt2bik7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEtleUVxdWFsc1ZhbHVlIGtleUVxdWFsc1ZhbHVlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgS2V5RXF1YWxzVmFsdWUgcmV0VmFsID0gbnVsbDsKKyAgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQga2V5ID0gbnVsbDsKKyAgVG9rZW4gZXF1YWxzID0gbnVsbDsKKyAgU3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQgdmFsdWUgPSBudWxsOworICAgIGtleSA9IHN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKCk7CisgICAgZXF1YWxzID0gampfY29uc3VtZV90b2tlbihFUVVBTFMpOworICAgIHZhbHVlID0gc3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKTsKKyAgICByZXRWYWwgPSBuZXcgS2V5RXF1YWxzVmFsdWUoa2V5LCBjcmVhdGVUb2tlbkluZm8oZXF1YWxzKSwgdmFsdWUpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBJbXBvcnRTdG10cyBpbXBvcnRTdG10cygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIEltcG9ydFN0bXRzIHJldFZhbCA9IG5ldyBJbXBvcnRTdG10cygpOworICBJbXBvcnRTdG10IGltcG9ydFN0bXQgPSBudWxsOworICAgIGxhYmVsXzQ6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChqal8yXzgoNCkpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfNDsKKyAgICAgIH0KKyAgICAgIGltcG9ydFN0bXQgPSBpbXBvcnRTdG10KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQoaW1wb3J0U3RtdCk7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEltcG9ydFN0bXQgaW1wb3J0U3RtdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIEltcG9ydFN0bXQgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gaW1wb3J0X0tXID0gbnVsbDsKKyAgVG9rZW4gYWxpYXMgPSBudWxsOworICBUb2tlbiBlcXVhbHMgPSBudWxsOworICBTdHJpbmdMaXRlcmFsT3JRdWFsaWZpZWRJRCB1cmkgPSBudWxsOworICBUb2tlbiBzZW1pID0gbnVsbDsKKyAgICBpbXBvcnRfS1cgPSBqal9jb25zdW1lX3Rva2VuKElNUE9SVEtXKTsKKyAgICBpZiAoampfMl85KDQpKSB7CisgICAgICBhbGlhcyA9IGpqX2NvbnN1bWVfdG9rZW4oSUQpOworICAgICAgZXF1YWxzID0gampfY29uc3VtZV90b2tlbihFUVVBTFMpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIHVyaSA9IHN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEKCk7CisgICAgc2VtaSA9IGpqX2NvbnN1bWVfdG9rZW4oU0VNSSk7CisgICAgcmV0VmFsID0gbmV3IEltcG9ydFN0bXQoY3JlYXRlVG9rZW5JbmZvKGltcG9ydF9LVyksIGNyZWF0ZVRva2VuSW5mbyhhbGlhcyksIGNyZWF0ZVRva2VuSW5mbyhlcXVhbHMpLCB1cmksIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFRvcExldmVsRGVjbHMgdG9wTGV2ZWxEZWNscygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFRvcExldmVsRGVjbHMgcmV0VmFsID0gbmV3IFRvcExldmVsRGVjbHMoKTsKKyAgVG9wTGV2ZWxEZWNsIHRvcExldmVsRGVjbCA9IG51bGw7CisgICAgbGFiZWxfNToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfMTAoNCkpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfNTsKKyAgICAgIH0KKyAgICAgIHRvcExldmVsRGVjbCA9IHRvcExldmVsRGVjbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5hZGRDaGlsZCh0b3BMZXZlbERlY2wpOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUb3BMZXZlbERlY2wgdG9wTGV2ZWxEZWNsKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgVG9wTGV2ZWxEZWNsIHJldFZhbCA9IG51bGw7CisgIEFubm90YXRpb25zIGFubm90YXRpb25zID0gbnVsbDsKKyAgICBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zKCk7CisgICAgaWYgKGpqXzJfMTEoNCkpIHsKKyAgICAgIHJldFZhbCA9IHN1YlBhY2thZ2VEZWNsKGFubm90YXRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfMTIoNCkpIHsKKyAgICAgIHJldFZhbCA9IGNsYXNzRGVjbChhbm5vdGF0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIH0gZWxzZSBpZiAoampfMl8xMyg0KSkgeworICAgICAgcmV0VmFsID0gZGF0YVR5cGVEZWNsKGFubm90YXRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgfSBlbHNlIGlmIChqal8yXzE0KDQpKSB7CisgICAgICByZXRWYWwgPSBlbnVtRGVjbChhbm5vdGF0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgfSBlbHNlIGlmIChqal8yXzE1KDQpKSB7CisgICAgICByZXRWYWwgPSBtYXBFbnRyeURlY2woYW5ub3RhdGlvbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgeworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBTdWJQYWNrYWdlRGVjbCBzdWJQYWNrYWdlRGVjbChBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgU3ViUGFja2FnZURlY2wgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gcGFja2FnZV9LVyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBsY3VybHkgPSBudWxsOworICBUb3BMZXZlbERlY2xzIHRvcExldmVsRGVjbHMgPSBudWxsOworICBUb2tlbiByY3VybHkgPSBudWxsOworICAgIHBhY2thZ2VfS1cgPSBqal9jb25zdW1lX3Rva2VuKFBBQ0tBR0VLVyk7CisgICAgbmFtZSA9IGpqX2NvbnN1bWVfdG9rZW4oSUQpOworICAgIGxjdXJseSA9IGpqX2NvbnN1bWVfdG9rZW4oTENVUkxZKTsKKyAgICB0b3BMZXZlbERlY2xzID0gdG9wTGV2ZWxEZWNscygpOworICAgIHJjdXJseSA9IGpqX2NvbnN1bWVfdG9rZW4oUkNVUkxZKTsKKyAgICByZXRWYWwgPSBuZXcgU3ViUGFja2FnZURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhwYWNrYWdlX0tXKSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8obGN1cmx5KSwgdG9wTGV2ZWxEZWNscywgY3JlYXRlVG9rZW5JbmZvKHJjdXJseSkpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBDbGFzc0RlY2wgY2xhc3NEZWNsKEFubm90YXRpb25zIGFubm90YXRpb25zKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBDbGFzc0RlY2wgcmV0VmFsID0gbnVsbDsKKyAgQWJzdHJhY3RNb2RpZmllciBhYnN0cmFjdE1vZGlmaWVyID0gbnVsbDsKKyAgQ2xhc3NLaW5kIGNsYXNzS2luZCA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUeXBlUGFyYW1zSW5mbyB0eXBlUGFyYW1zSW5mbyA9IG51bGw7CisgIFRva2VuIGV4dGVuZHNfS1cgPSBudWxsOworICBDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQgc3VwZXJUeXBlcyA9IG51bGw7CisgIFRva2VuIGNvbG9uID0gbnVsbDsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCBpbnN0Q2xhc3NOYW1lID0gbnVsbDsKKyAgVG9rZW4gbGN1cmx5ID0gbnVsbDsKKyAgQ2xhc3NNZW1iZXJEZWNscyBjbGFzc01lbWJlckRlY2xzID0gbnVsbDsKKyAgVG9rZW4gcmN1cmx5ID0gbnVsbDsKKyAgICBpZiAoampfMl8xNig0KSkgeworICAgICAgYWJzdHJhY3RNb2RpZmllciA9IGFic3RyYWN0TW9kaWZpZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICBjbGFzc0tpbmQgPSBjbGFzc0tpbmQoKTsKKyAgICBuYW1lID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgaWYgKGpqXzJfMTcoNCkpIHsKKyAgICAgIHR5cGVQYXJhbXNJbmZvID0gdHlwZVBhcmFtc0luZm8oKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICBpZiAoampfMl8xOCg0KSkgeworICAgICAgZXh0ZW5kc19LVyA9IGpqX2NvbnN1bWVfdG9rZW4oRVhURU5EU0tXKTsKKyAgICAgIHN1cGVyVHlwZXMgPSBjb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQoKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICBpZiAoampfMl8xOSg0KSkgeworICAgICAgY29sb24gPSBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKKyAgICAgIGluc3RDbGFzc05hbWUgPSBib3VuZEV4Y2VwdFdpbGRjYXJkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgbGN1cmx5ID0gampfY29uc3VtZV90b2tlbihMQ1VSTFkpOworICAgIGNsYXNzTWVtYmVyRGVjbHMgPSBjbGFzc01lbWJlckRlY2xzKCk7CisgICAgcmN1cmx5ID0gampfY29uc3VtZV90b2tlbihSQ1VSTFkpOworICAgIHJldFZhbCA9IG5ldyBDbGFzc0RlY2woYW5ub3RhdGlvbnMsIGFic3RyYWN0TW9kaWZpZXIsIGNsYXNzS2luZCwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCB0eXBlUGFyYW1zSW5mbywgY3JlYXRlVG9rZW5JbmZvKGV4dGVuZHNfS1cpLCBzdXBlclR5cGVzLCBjcmVhdGVUb2tlbkluZm8oY29sb24pLCBpbnN0Q2xhc3NOYW1lLCBjcmVhdGVUb2tlbkluZm8obGN1cmx5KSwgY2xhc3NNZW1iZXJEZWNscywgY3JlYXRlVG9rZW5JbmZvKHJjdXJseSkpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQgY29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgQ29tbWFMaXN0Qm91bmRFeGNlcHRXaWxkIHJldFZhbCA9IG5ldyBDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQoKTsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCB0YjEgPSBudWxsOworICBUb2tlbiBjb21tYSA9IG51bGw7CisgIEJvdW5kRXhjZXB0V2lsZGNhcmQgdGJuID0gbnVsbDsKKyAgICB0YjEgPSBib3VuZEV4Y2VwdFdpbGRjYXJkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5hZGRDaGlsZCh0YjEpOworICAgIGxhYmVsXzY6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChqal8yXzIwKDQpKSB7CisgICAgICAgIDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrIGxhYmVsXzY7CisgICAgICB9CisgICAgICBjb21tYSA9IGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOworICAgICAgdGJuID0gYm91bmRFeGNlcHRXaWxkY2FyZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5hZGRDaGlsZChjcmVhdGVUb2tlbkluZm8oY29tbWEpKTsgcmV0VmFsLmFkZENoaWxkKHRibik7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQWJzdHJhY3RNb2RpZmllciBhYnN0cmFjdE1vZGlmaWVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgQWJzdHJhY3RNb2RpZmllciByZXRWYWwgPSBudWxsOworICBUb2tlbiBhYnN0cmFjdF9LVyA9IG51bGw7CisgICAgYWJzdHJhY3RfS1cgPSBqal9jb25zdW1lX3Rva2VuKEFCU1RSQUNUS1cpOworICAgIHJldFZhbCA9IG5ldyBBYnN0cmFjdE1vZGlmaWVyKGNyZWF0ZVRva2VuSW5mbyhhYnN0cmFjdF9LVykpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBDbGFzc0tpbmQgY2xhc3NLaW5kKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgVG9rZW4gdG9rOworICAgIGlmIChqal8yXzIxKDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKENMQVNTS1cpOworICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IENsYXNzS2luZCAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfMjIoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oSU5URVJGQUNFS1cpOworICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBDbGFzc0tpbmQgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgVHlwZVBhcmFtc0luZm8gdHlwZVBhcmFtc0luZm8oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUeXBlUGFyYW1zSW5mbyByZXRWYWwgPSBudWxsOworICBUb2tlbiBsdCA9IG51bGw7CisgIE9uZU9yTW9yZVR5cGVQYXJhbXMgb25lT3JNb3JlVHlwZVBhcmFtcyA9IG51bGw7CisgIFRva2VuIGd0ID0gbnVsbDsKKyAgICBsdCA9IGpqX2NvbnN1bWVfdG9rZW4oTFQpOworICAgIG9uZU9yTW9yZVR5cGVQYXJhbXMgPSBvbmVPck1vcmVUeXBlUGFyYW1zKCk7CisgICAgZ3QgPSBqal9jb25zdW1lX3Rva2VuKEdUKTsKKyAgICByZXRWYWwgPSBuZXcgVHlwZVBhcmFtc0luZm8oY3JlYXRlVG9rZW5JbmZvKGx0KSwgb25lT3JNb3JlVHlwZVBhcmFtcywgY3JlYXRlVG9rZW5JbmZvKGd0KSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIE9uZU9yTW9yZVR5cGVQYXJhbXMgb25lT3JNb3JlVHlwZVBhcmFtcygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIE9uZU9yTW9yZVR5cGVQYXJhbXMgcmV0VmFsID0gbmV3IE9uZU9yTW9yZVR5cGVQYXJhbXMoKTsKKyAgVHlwZVBhcmFtIHRwMSA9IG51bGw7CisgIFRva2VuIGNvbW1hID0gbnVsbDsKKyAgVHlwZVBhcmFtIHRwbiA9IG51bGw7CisgICAgdHAxID0gdHlwZVBhcmFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKHRwMSk7CisgICAgbGFiZWxfNzoKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfMjMoNCkpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfNzsKKyAgICAgIH0KKyAgICAgIGNvbW1hID0gampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICB0cG4gPSB0eXBlUGFyYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5hZGRDaGlsZChjcmVhdGVUb2tlbkluZm8oY29tbWEpKTsgcmV0VmFsLmFkZENoaWxkKHRwbik7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUeXBlUGFyYW0gdHlwZVBhcmFtKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgVHlwZVBhcmFtIHJldFZhbCA9IG51bGw7CisgIFRva2VuIHR5cGVWYXJOYW1lID0gbnVsbDsKKyAgVHlwZUJvdW5kc0luZm8gdHlwZUJvdW5kc0luZm8gPSBudWxsOworICAgIHR5cGVWYXJOYW1lID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgaWYgKGpqXzJfMjQoNCkpIHsKKyAgICAgIHR5cGVCb3VuZHNJbmZvID0gdHlwZUJvdW5kc0luZm8oKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICByZXRWYWwgPSBuZXcgVHlwZVBhcmFtKGNyZWF0ZVRva2VuSW5mbyh0eXBlVmFyTmFtZSksIHR5cGVCb3VuZHNJbmZvKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgVHlwZUJvdW5kc0luZm8gdHlwZUJvdW5kc0luZm8oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUeXBlQm91bmRzSW5mbyByZXRWYWwgPSBudWxsOworICBUb2tlbiBleHRlbmRzX0tXID0gbnVsbDsKKyAgT25lT3JNb3JlVHlwZVBhcmFtQm91bmRzIG9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcyA9IG51bGw7CisgICAgZXh0ZW5kc19LVyA9IGpqX2NvbnN1bWVfdG9rZW4oRVhURU5EU0tXKTsKKyAgICBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMgPSBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMoKTsKKyAgICByZXRWYWwgPSBuZXcgVHlwZUJvdW5kc0luZm8oY3JlYXRlVG9rZW5JbmZvKGV4dGVuZHNfS1cpLCBvbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBPbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMgb25lT3JNb3JlVHlwZVBhcmFtQm91bmRzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgT25lT3JNb3JlVHlwZVBhcmFtQm91bmRzIHJldFZhbCA9IG5ldyBPbmVPck1vcmVUeXBlUGFyYW1Cb3VuZHMoKTsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCB0YjEgPSBudWxsOworICBUb2tlbiBhbXAgPSBudWxsOworICBCb3VuZEV4Y2VwdFdpbGRjYXJkIHRibiA9IG51bGw7CisgICAgdGIxID0gYm91bmRFeGNlcHRXaWxkY2FyZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQodGIxKTsKKyAgICBsYWJlbF84OgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoampfMl8yNSg0KSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF84OworICAgICAgfQorICAgICAgYW1wID0gampfY29uc3VtZV90b2tlbihBTVApOworICAgICAgdGJuID0gYm91bmRFeGNlcHRXaWxkY2FyZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhhbXApKTsgcmV0VmFsLmFkZENoaWxkKHRibik7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgQm91bmRFeGNlcHRXaWxkY2FyZCBib3VuZEV4Y2VwdFdpbGRjYXJkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgQm91bmRFeGNlcHRXaWxkY2FyZCByZXRWYWwgPSBudWxsOworICBRdWFsaWZpZWRJRCByYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSA9IG51bGw7CisgIFRva2VuIGx0ID0gbnVsbDsKKyAgT25lT3JNb3JlVHlwZUFyZ3Mgb25lT3JNb3JlVHlwZUFyZ3MgPSBudWxsOworICBUb2tlbiBndCA9IG51bGw7CisgICAgcmF3VE5hbWVPclRWYXJPclBhcmFtemVkVE5hbWUgPSBxdWFsaWZpZWRJRCgpOworICAgIGlmIChqal8yXzI2KDQpKSB7CisgICAgICBsdCA9IGpqX2NvbnN1bWVfdG9rZW4oTFQpOworICAgICAgb25lT3JNb3JlVHlwZUFyZ3MgPSBvbmVPck1vcmVUeXBlQXJncygpOworICAgICAgZ3QgPSBqal9jb25zdW1lX3Rva2VuKEdUKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICByZXRWYWwgPSBuZXcgQm91bmRFeGNlcHRXaWxkY2FyZChyYXdUTmFtZU9yVFZhck9yUGFyYW16ZWRUTmFtZSwgY3JlYXRlVG9rZW5JbmZvKGx0KSwgb25lT3JNb3JlVHlwZUFyZ3MsIGNyZWF0ZVRva2VuSW5mbyhndCkpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBPbmVPck1vcmVUeXBlQXJncyBvbmVPck1vcmVUeXBlQXJncygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIE9uZU9yTW9yZVR5cGVBcmdzIHJldFZhbCA9IG5ldyBPbmVPck1vcmVUeXBlQXJncygpOworICBUeXBlQXJnIHRhMSA9IG51bGw7CisgIFRva2VuIGNvbW1hID0gbnVsbDsKKyAgVHlwZUFyZyB0YW4gPSBudWxsOworICAgIHRhMSA9IHR5cGVBcmcoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKHRhMSk7CisgICAgbGFiZWxfOToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfMjcoNCkpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfOTsKKyAgICAgIH0KKyAgICAgIGNvbW1hID0gampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICB0YW4gPSB0eXBlQXJnKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhjb21tYSkpOyByZXRWYWwuYWRkQ2hpbGQodGFuKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUeXBlQXJnIHR5cGVBcmcoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUeXBlQXJnIHJldFZhbCA9IG51bGw7CisgICAgaWYgKGpqXzJfMjgoNCkpIHsKKyAgICAgIHJldFZhbCA9IGJvdW5kRXhjZXB0V2lsZGNhcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfMjkoNCkpIHsKKyAgICAgIHJldFZhbCA9IHdpbGRjYXJkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIH0gZWxzZSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFdpbGRjYXJkIHdpbGRjYXJkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgV2lsZGNhcmQgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gcW1hcmsgPSBudWxsOworICBFeHRlbmRzT3JTdXBlciBleHRlbmRzT3JTdXBlciA9IG51bGw7CisgIEJvdW5kRXhjZXB0V2lsZGNhcmQgYm91bmRFeGNlcHRXaWxkY2FyZCA9IG51bGw7CisgICAgcW1hcmsgPSBqal9jb25zdW1lX3Rva2VuKFFNQVJLKTsKKyAgICBpZiAoampfMl8zMCg0KSkgeworICAgICAgZXh0ZW5kc09yU3VwZXIgPSBleHRlbmRzT3JTdXBlcigpOworICAgICAgYm91bmRFeGNlcHRXaWxkY2FyZCA9IGJvdW5kRXhjZXB0V2lsZGNhcmQoKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICByZXRWYWwgPSBuZXcgV2lsZGNhcmQoY3JlYXRlVG9rZW5JbmZvKHFtYXJrKSwgZXh0ZW5kc09yU3VwZXIsIGJvdW5kRXhjZXB0V2lsZGNhcmQpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFeHRlbmRzT3JTdXBlciBleHRlbmRzT3JTdXBlcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFRva2VuIHRvazsKKyAgICBpZiAoampfMl8zMSg0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihFWFRFTkRTS1cpOworICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgRXh0ZW5kc09yU3VwZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIGlmIChqal8yXzMyKDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKFNVUEVSS1cpOworICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IEV4dGVuZHNPclN1cGVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIENsYXNzTWVtYmVyRGVjbHMgY2xhc3NNZW1iZXJEZWNscygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIENsYXNzTWVtYmVyRGVjbHMgcmV0VmFsID0gbmV3IENsYXNzTWVtYmVyRGVjbHMoKTsKKyAgQ2xhc3NNZW1iZXJEZWNsIGNsYXNzTWVtYmVyRGVjbCA9IG51bGw7CisgICAgbGFiZWxfMTA6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChqal8yXzMzKDQpKSB7CisgICAgICAgIDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrIGxhYmVsXzEwOworICAgICAgfQorICAgICAgY2xhc3NNZW1iZXJEZWNsID0gY2xhc3NNZW1iZXJEZWNsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKGNsYXNzTWVtYmVyRGVjbCk7CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIENsYXNzTWVtYmVyRGVjbCBjbGFzc01lbWJlckRlY2woKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBDbGFzc01lbWJlckRlY2wgcmV0VmFsID0gbnVsbDsKKyAgQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgPSBudWxsOworICBNb2RpZmllcnMgbW9kaWZpZXJzID0gbnVsbDsKKyAgICBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zKCk7CisgICAgbW9kaWZpZXJzID0gbW9kaWZpZXJzKCk7CisgICAgaWYgKGpqXzJfMzQoNCkpIHsKKyAgICAgIHJldFZhbCA9IGF0dHJpYnV0ZShhbm5vdGF0aW9ucywgbW9kaWZpZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfMzUoNCkpIHsKKyAgICAgIHJldFZhbCA9IHJlZmVyZW5jZShhbm5vdGF0aW9ucywgbW9kaWZpZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfMzYoNCkpIHsKKyAgICAgIHJldFZhbCA9IG9wZXJhdGlvbihhbm5vdGF0aW9ucywgbW9kaWZpZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgeworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBBdHRyaWJ1dGUgYXR0cmlidXRlKEFubm90YXRpb25zIGFubm90YXRpb25zLCBNb2RpZmllcnMgbW9kaWZpZXJzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBBdHRyaWJ1dGUgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gYXR0cl9LVyA9IG51bGw7CisgIFR5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBlcXVhbHMgPSBudWxsOworICBEZWZhdWx0VmFsdWVFeHByIGRlZmF1bHRWYWx1ZUV4cHIgPSBudWxsOworICBUb2tlbiBzZW1pID0gbnVsbDsKKyAgICBhdHRyX0tXID0gampfY29uc3VtZV90b2tlbihBVFRSS1cpOworICAgIHR5cGVXaXRoTXVsdGkgPSB0eXBlV2l0aE11bHRpKCk7CisgICAgbmFtZSA9IGpqX2NvbnN1bWVfdG9rZW4oSUQpOworICAgIGlmIChqal8yXzM3KDQpKSB7CisgICAgICBlcXVhbHMgPSBqal9jb25zdW1lX3Rva2VuKEVRVUFMUyk7CisgICAgICBkZWZhdWx0VmFsdWVFeHByID0gZGVmYXVsdFZhbHVlRXhwcigpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIHNlbWkgPSBqal9jb25zdW1lX3Rva2VuKFNFTUkpOworICAgIHJldFZhbCA9IG5ldyBBdHRyaWJ1dGUoYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgY3JlYXRlVG9rZW5JbmZvKGF0dHJfS1cpLCB0eXBlV2l0aE11bHRpLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIGNyZWF0ZVRva2VuSW5mbyhlcXVhbHMpLCBkZWZhdWx0VmFsdWVFeHByLCBjcmVhdGVUb2tlbkluZm8oc2VtaSkpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUeXBlV2l0aE11bHRpIHR5cGVXaXRoTXVsdGkoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUeXBlV2l0aE11bHRpIHJldFZhbCA9IG51bGw7CisgIEJvdW5kRXhjZXB0V2lsZGNhcmQgbmFtZSA9IG51bGw7CisgIE11bHRpcGxpY2l0eSBtdWx0aXBsaWNpdHkgPSBudWxsOworICAgIG5hbWUgPSBib3VuZEV4Y2VwdFdpbGRjYXJkKCk7CisgICAgaWYgKGpqXzJfMzgoNCkpIHsKKyAgICAgIG11bHRpcGxpY2l0eSA9IG11bHRpcGxpY2l0eSgpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIHJldFZhbCA9IG5ldyBUeXBlV2l0aE11bHRpKG5hbWUsIG11bHRpcGxpY2l0eSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIE11bHRpcGxpY2l0eSBtdWx0aXBsaWNpdHkoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBNdWx0aXBsaWNpdHkgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gbHNxdWFyZSA9IG51bGw7CisgIE11bHRpcGxpY2l0eUV4cHIgbXVsdGlwbGljaXR5RXhwciA9IG51bGw7CisgIFRva2VuIHJzcXVhcmUgPSBudWxsOworICAgIGxzcXVhcmUgPSBqal9jb25zdW1lX3Rva2VuKExTUVVBUkUpOworICAgIGlmIChqal8yXzM5KDQpKSB7CisgICAgICBtdWx0aXBsaWNpdHlFeHByID0gbXVsdGlwbGljaXR5RXhwcigpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIHJzcXVhcmUgPSBqal9jb25zdW1lX3Rva2VuKFJTUVVBUkUpOworICAgIHJldFZhbCA9IG5ldyBNdWx0aXBsaWNpdHkoY3JlYXRlVG9rZW5JbmZvKGxzcXVhcmUpLCBtdWx0aXBsaWNpdHlFeHByLCBjcmVhdGVUb2tlbkluZm8ocnNxdWFyZSkpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBNdWx0aXBsaWNpdHlFeHByIG11bHRpcGxpY2l0eUV4cHIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBNdWx0aXBsaWNpdHlFeHByIHJldFZhbCA9IG51bGw7CisgIFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgbG93ZXJCb3VuZCA9IG51bGw7CisgIFRva2VuIGRvdF9kb3QgPSBudWxsOworICBTaW1wbGVNdWx0aXBsaWNpdHlFeHByIHVwcGVyQm91bmQgPSBudWxsOworICAgIGxvd2VyQm91bmQgPSBzaW1wbGVNdWx0aXBsaWNpdHlFeHByKCk7CisgICAgaWYgKGpqXzJfNDAoNCkpIHsKKyAgICAgIGRvdF9kb3QgPSBqal9jb25zdW1lX3Rva2VuKERPVF9ET1QpOworICAgICAgdXBwZXJCb3VuZCA9IHNpbXBsZU11bHRpcGxpY2l0eUV4cHIoKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICByZXRWYWwgPSBuZXcgTXVsdGlwbGljaXR5RXhwcihsb3dlckJvdW5kLCBjcmVhdGVUb2tlbkluZm8oZG90X2RvdCksIHVwcGVyQm91bmQpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBTaW1wbGVNdWx0aXBsaWNpdHlFeHByIHNpbXBsZU11bHRpcGxpY2l0eUV4cHIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUb2tlbiB0b2s7CisgICAgaWYgKGpqXzJfNDEoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oU1RBUik7CisgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgU2ltcGxlTXVsdGlwbGljaXR5RXhwciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNDIoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oUExVUyk7CisgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgU2ltcGxlTXVsdGlwbGljaXR5RXhwciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNDMoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oUU1BUkspOworICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBTaW1wbGVNdWx0aXBsaWNpdHlFeHByIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSBpZiAoampfMl80NCg0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihJTlRfTElURVJBTCk7CisgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IFNpbXBsZU11bHRpcGxpY2l0eUV4cHIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIHsKKyAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOworICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgUmVmZXJlbmNlIHJlZmVyZW5jZShBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucywgTW9kaWZpZXJzIG1vZGlmaWVycykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgUmVmZXJlbmNlIHJldFZhbCA9IG51bGw7CisgIFJlZmVyZW5jZUtpbmQgcmVmZXJlbmNlS2luZCA9IG51bGw7CisgIFR5cGVXaXRoTXVsdGkgdHlwZVdpdGhNdWx0aSA9IG51bGw7CisgIFRva2VuIGhhc2ggPSBudWxsOworICBUb2tlbiBvcHBvc2l0ZU5hbWUgPSBudWxsOworICBUb2tlbiBuYW1lID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7CisgICAgcmVmZXJlbmNlS2luZCA9IHJlZmVyZW5jZUtpbmQoKTsKKyAgICB0eXBlV2l0aE11bHRpID0gdHlwZVdpdGhNdWx0aSgpOworICAgIGlmIChqal8yXzQ1KDQpKSB7CisgICAgICBoYXNoID0gampfY29uc3VtZV90b2tlbihIQVNIKTsKKyAgICAgIG9wcG9zaXRlTmFtZSA9IGpqX2NvbnN1bWVfdG9rZW4oSUQpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIG5hbWUgPSBqal9jb25zdW1lX3Rva2VuKElEKTsKKyAgICBzZW1pID0gampfY29uc3VtZV90b2tlbihTRU1JKTsKKyAgICByZXRWYWwgPSBuZXcgUmVmZXJlbmNlKGFubm90YXRpb25zLCBtb2RpZmllcnMsIHJlZmVyZW5jZUtpbmQsIHR5cGVXaXRoTXVsdGksIGNyZWF0ZVRva2VuSW5mbyhoYXNoKSwgY3JlYXRlVG9rZW5JbmZvKG9wcG9zaXRlTmFtZSksIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKHNlbWkpKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgUmVmZXJlbmNlS2luZCByZWZlcmVuY2VLaW5kKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgVG9rZW4gdG9rOworICAgIGlmIChqal8yXzQ2KDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKFJFRktXKTsKKyAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgUmVmZXJlbmNlS2luZCAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNDcoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oVkFMS1cpOworICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBSZWZlcmVuY2VLaW5kIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIE1vZGlmaWVycyBtb2RpZmllcnMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBNb2RpZmllcnMgcmV0VmFsID0gbmV3IE1vZGlmaWVycygpOworICBPcHROZWdhdGVkTW9kaWZpZXIgb3B0TmVnYXRlZE1vZGlmaWVyID0gbnVsbDsKKyAgICBsYWJlbF8xMToKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKGpqXzJfNDgoNCkpIHsKKyAgICAgICAgOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsgbGFiZWxfMTE7CisgICAgICB9CisgICAgICBvcHROZWdhdGVkTW9kaWZpZXIgPSBvcHROZWdhdGVkTW9kaWZpZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQob3B0TmVnYXRlZE1vZGlmaWVyKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgT3B0TmVnYXRlZE1vZGlmaWVyIG9wdE5lZ2F0ZWRNb2RpZmllcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIE9wdE5lZ2F0ZWRNb2RpZmllciByZXRWYWwgPSBudWxsOworICBUb2tlbiBiYW5nID0gbnVsbDsKKyAgTW9kaWZpZXIgbW9kaWZpZXIgPSBudWxsOworICAgIGlmIChqal8yXzQ5KDQpKSB7CisgICAgICBiYW5nID0gampfY29uc3VtZV90b2tlbihCQU5HKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICBtb2RpZmllciA9IG1vZGlmaWVyKCk7CisgICAgcmV0VmFsID0gbmV3IE9wdE5lZ2F0ZWRNb2RpZmllcihjcmVhdGVUb2tlbkluZm8oYmFuZyksIG1vZGlmaWVyKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgTW9kaWZpZXIgbW9kaWZpZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUb2tlbiB0b2s7CisgICAgaWYgKGpqXzJfNTAoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oUkVBRE9OTFlLVyk7CisgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgTW9kaWZpZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIGlmIChqal8yXzUxKDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKFZPTEFUSUxFS1cpOworICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSBpZiAoampfMl81Mig0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihUUkFOU0lFTlRLVyk7CisgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSBpZiAoampfMl81Myg0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihVTlNFVFRBQkxFS1cpOworICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgTW9kaWZpZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIGlmIChqal8yXzU0KDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKERFUklWRURLVyk7CisgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBNb2RpZmllciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNTUoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oVU5JUVVFS1cpOworICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBNb2RpZmllciAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNTYoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oT1JERVJFREtXKTsKKyAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSBpZiAoampfMl81Nyg0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihSRVNPTFZFS1cpOworICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBuZXcgTW9kaWZpZXIgKGNyZWF0ZVRva2VuSW5mbyh0b2spKTt9CisgICAgfSBlbHNlIGlmIChqal8yXzU4KDQpKSB7CisgICAgICB0b2sgPSBqal9jb25zdW1lX3Rva2VuKElES1cpOworICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IE1vZGlmaWVyIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSB7CisgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKKyAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIERlZmF1bHRWYWx1ZUV4cHIgZGVmYXVsdFZhbHVlRXhwcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIERlZmF1bHRWYWx1ZUV4cHIgcmV0VmFsID0gbnVsbDsKKyAgICBpZiAoampfMl81OSg0KSkgeworICAgICAgcmV0VmFsID0gYm9vbEV4cHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgfSBlbHNlIGlmIChqal8yXzYwKDQpKSB7CisgICAgICByZXRWYWwgPSBpbnRFeHByKCk7CisgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgfSBlbHNlIGlmIChqal8yXzYxKDQpKSB7CisgICAgICByZXRWYWwgPSBzdHJpbmdFeHByKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgfSBlbHNlIGlmIChqal8yXzYyKDQpKSB7CisgICAgICByZXRWYWwgPSBjaGFyRXhwcigpOworICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgeworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBCb29sRXhwciBib29sRXhwcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIEJvb2xFeHByIHJldFZhbCA9IG51bGw7CisgIFRydWVPckZhbHNlIHRydWVPckZhbHNlID0gbnVsbDsKKyAgICB0cnVlT3JGYWxzZSA9IHRydWVPckZhbHNlKCk7CisgICAgcmV0VmFsID0gbmV3IEJvb2xFeHByKHRydWVPckZhbHNlKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgVHJ1ZU9yRmFsc2UgdHJ1ZU9yRmFsc2UoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBUb2tlbiB0b2s7CisgICAgaWYgKGpqXzJfNjMoNCkpIHsKKyAgICAgIHRvayA9IGpqX2NvbnN1bWVfdG9rZW4oVFJVRUtXKTsKKyAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbmV3IFRydWVPckZhbHNlIChjcmVhdGVUb2tlbkluZm8odG9rKSk7fQorICAgIH0gZWxzZSBpZiAoampfMl82NCg0KSkgeworICAgICAgdG9rID0gampfY29uc3VtZV90b2tlbihGQUxTRUtXKTsKKyAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIG5ldyBUcnVlT3JGYWxzZSAoY3JlYXRlVG9rZW5JbmZvKHRvaykpO30KKyAgICB9IGVsc2UgeworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBJbnRFeHByIGludEV4cHIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBJbnRFeHByIHJldFZhbCA9IG51bGw7CisgIFRva2VuIG1pbnVzID0gbnVsbDsKKyAgVG9rZW4gaW50X2xpdGVyYWwgPSBudWxsOworICAgIGlmIChqal8yXzY1KDQpKSB7CisgICAgICBtaW51cyA9IGpqX2NvbnN1bWVfdG9rZW4oTUlOVVMpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIGludF9saXRlcmFsID0gampfY29uc3VtZV90b2tlbihJTlRfTElURVJBTCk7CisgICAgcmV0VmFsID0gbmV3IEludEV4cHIoY3JlYXRlVG9rZW5JbmZvKG1pbnVzKSwgY3JlYXRlVG9rZW5JbmZvKGludF9saXRlcmFsKSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIFN0cmluZ0V4cHIgc3RyaW5nRXhwcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFN0cmluZ0V4cHIgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gc3RyaW5nX2xpdGVyYWwgPSBudWxsOworICAgIHN0cmluZ19saXRlcmFsID0gampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7CisgICAgcmV0VmFsID0gbmV3IFN0cmluZ0V4cHIoY3JlYXRlVG9rZW5JbmZvKHN0cmluZ19saXRlcmFsKSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIENoYXJFeHByIGNoYXJFeHByKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgQ2hhckV4cHIgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gY2hhcl9saXRlcmFsID0gbnVsbDsKKyAgICBjaGFyX2xpdGVyYWwgPSBqal9jb25zdW1lX3Rva2VuKENIQVJfTElURVJBTCk7CisgICAgcmV0VmFsID0gbmV3IENoYXJFeHByKGNyZWF0ZVRva2VuSW5mbyhjaGFyX2xpdGVyYWwpKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgT3BlcmF0aW9uIG9wZXJhdGlvbihBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucywgTW9kaWZpZXJzIG1vZGlmaWVycykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgT3BlcmF0aW9uIHJldFZhbCA9IG51bGw7CisgIFRva2VuIG9wX0tXID0gbnVsbDsKKyAgVHlwZVBhcmFtc0luZm8gdHlwZVBhcmFtc0luZm8gPSBudWxsOworICBSZXN1bHRUeXBlIHJlc1R5cGUgPSBudWxsOworICBUb2tlbiBuYW1lID0gbnVsbDsKKyAgVG9rZW4gbHBhcmVuID0gbnVsbDsKKyAgUGFyYW1zIHBhcmFtcyA9IG51bGw7CisgIFRva2VuIHJwYXJlbiA9IG51bGw7CisgIFRva2VuIHRocm93c19LVyA9IG51bGw7CisgIENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBleGNlcHRpb25zID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7CisgICAgb3BfS1cgPSBqal9jb25zdW1lX3Rva2VuKE9QS1cpOworICAgIGlmIChqal8yXzY2KDQpKSB7CisgICAgICB0eXBlUGFyYW1zSW5mbyA9IHR5cGVQYXJhbXNJbmZvKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIDsKKyAgICB9CisgICAgcmVzVHlwZSA9IHJlc3VsdFR5cGUoKTsKKyAgICBuYW1lID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgbHBhcmVuID0gampfY29uc3VtZV90b2tlbihMUEFSRU4pOworICAgIGlmIChqal8yXzY3KDQpKSB7CisgICAgICBwYXJhbXMgPSBwYXJhbXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgOworICAgIH0KKyAgICBycGFyZW4gPSBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7CisgICAgaWYgKGpqXzJfNjgoNCkpIHsKKyAgICAgIHRocm93c19LVyA9IGpqX2NvbnN1bWVfdG9rZW4oVEhST1dTS1cpOworICAgICAgZXhjZXB0aW9ucyA9IGNvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCgpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIHNlbWkgPSBqal9jb25zdW1lX3Rva2VuKFNFTUkpOworICAgIHJldFZhbCA9IG5ldyBPcGVyYXRpb24oYW5ub3RhdGlvbnMsIG1vZGlmaWVycywgY3JlYXRlVG9rZW5JbmZvKG9wX0tXKSwgdHlwZVBhcmFtc0luZm8sIHJlc1R5cGUsIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGxwYXJlbiksIHBhcmFtcywgY3JlYXRlVG9rZW5JbmZvKHJwYXJlbiksIGNyZWF0ZVRva2VuSW5mbyh0aHJvd3NfS1cpLCBleGNlcHRpb25zLCBjcmVhdGVUb2tlbkluZm8oc2VtaSkpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBSZXN1bHRUeXBlIHJlc3VsdFR5cGUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBSZXN1bHRUeXBlIHJldFZhbCA9IG51bGw7CisgICAgaWYgKGpqXzJfNjkoNCkpIHsKKyAgICAgIHJldFZhbCA9IHR5cGVXaXRoTXVsdGkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgaWYgKGpqXzJfNzAoNCkpIHsKKyAgICAgIHJldFZhbCA9IHZvaWRDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB9IGVsc2UgeworICAgICAgampfY29uc3VtZV90b2tlbigtMSk7CisgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBWb2lkQ29udGFpbmVyIHZvaWRDb250YWluZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBWb2lkQ29udGFpbmVyIHJldFZhbCA9IG51bGw7CisgIFRva2VuIHZvaWRfS1cgPSBudWxsOworICAgIHZvaWRfS1cgPSBqal9jb25zdW1lX3Rva2VuKFZPSURLVyk7CisgICAgcmV0VmFsID0gbmV3IFZvaWRDb250YWluZXIoY3JlYXRlVG9rZW5JbmZvKHZvaWRfS1cpKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgUGFyYW1zIHBhcmFtcygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFBhcmFtcyByZXRWYWwgPSBuZXcgUGFyYW1zKCk7CisgIFBhcmFtIHAxID0gbnVsbDsKKyAgVG9rZW4gY29tbWEgPSBudWxsOworICBQYXJhbSBwbiA9IG51bGw7CisgICAgcDEgPSBwYXJhbSgpOworICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQocDEpOworICAgIGxhYmVsXzEyOgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoampfMl83MSg0KSkgeworICAgICAgICA7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhayBsYWJlbF8xMjsKKyAgICAgIH0KKyAgICAgIGNvbW1hID0gampfY29uc3VtZV90b2tlbihDT01NQSk7CisgICAgICBwbiA9IHBhcmFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmFkZENoaWxkKGNyZWF0ZVRva2VuSW5mbyhjb21tYSkpOyByZXRWYWwuYWRkQ2hpbGQocG4pOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgUGFyYW0gcGFyYW0oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBQYXJhbSByZXRWYWwgPSBudWxsOworICBBbm5vdGF0aW9ucyBsZWFkaW5nQW5ub3RhdGlvbnMgPSBudWxsOworICBNb2RpZmllcnMgbW9kaWZpZXJzID0gbnVsbDsKKyAgVHlwZVdpdGhNdWx0aSB0eXBlV2l0aE11bHRpID0gbnVsbDsKKyAgVG9rZW4gbmFtZSA9IG51bGw7CisgIEFubm90YXRpb25zIHRyYWlsaW5nQW5ub3RhdGlvbnMgPSBudWxsOworICAgIGxlYWRpbmdBbm5vdGF0aW9ucyA9IGFubm90YXRpb25zKCk7CisgICAgbW9kaWZpZXJzID0gbW9kaWZpZXJzKCk7CisgICAgdHlwZVdpdGhNdWx0aSA9IHR5cGVXaXRoTXVsdGkoKTsKKyAgICBuYW1lID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgdHJhaWxpbmdBbm5vdGF0aW9ucyA9IGFubm90YXRpb25zKCk7CisgICAgcmV0VmFsID0gbmV3IFBhcmFtKGxlYWRpbmdBbm5vdGF0aW9ucywgbW9kaWZpZXJzLCB0eXBlV2l0aE11bHRpLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIHRyYWlsaW5nQW5ub3RhdGlvbnMpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBEYXRhVHlwZURlY2wgZGF0YVR5cGVEZWNsKEFubm90YXRpb25zIGFubm90YXRpb25zKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBEYXRhVHlwZURlY2wgcmV0VmFsID0gbnVsbDsKKyAgVHJhbnNpZW50TW9kaWZpZXIgdHJhbnNpZW50TW9kaWZpZXIgPSBudWxsOworICBUb2tlbiBkYXRhdHlwZV9LVyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBjb2xvbiA9IG51bGw7CisgIFN0cmluZ0xpdGVyYWxPclF1YWxpZmllZElEIGluc3RDbGFzc05hbWUgPSBudWxsOworICBUb2tlbiBzZW1pID0gbnVsbDsKKyAgICBpZiAoampfMl83Mig0KSkgeworICAgICAgdHJhbnNpZW50TW9kaWZpZXIgPSB0cmFuc2llbnRNb2RpZmllcigpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIGRhdGF0eXBlX0tXID0gampfY29uc3VtZV90b2tlbihEQVRBVFlQRUtXKTsKKyAgICBuYW1lID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgY29sb24gPSBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKKyAgICBpbnN0Q2xhc3NOYW1lID0gc3RyaW5nTGl0ZXJhbE9yUXVhbGlmaWVkSUQoKTsKKyAgICBzZW1pID0gampfY29uc3VtZV90b2tlbihTRU1JKTsKKyAgICByZXRWYWwgPSBuZXcgRGF0YVR5cGVEZWNsKGFubm90YXRpb25zLCB0cmFuc2llbnRNb2RpZmllciwgY3JlYXRlVG9rZW5JbmZvKGRhdGF0eXBlX0tXKSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8oY29sb24pLCBpbnN0Q2xhc3NOYW1lLCBjcmVhdGVUb2tlbkluZm8oc2VtaSkpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUcmFuc2llbnRNb2RpZmllciB0cmFuc2llbnRNb2RpZmllcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIFRyYW5zaWVudE1vZGlmaWVyIHJldFZhbCA9IG51bGw7CisgIFRva2VuIHRyYW5zaWVudF9LVyA9IG51bGw7CisgICAgdHJhbnNpZW50X0tXID0gampfY29uc3VtZV90b2tlbihUUkFOU0lFTlRLVyk7CisgICAgcmV0VmFsID0gbmV3IFRyYW5zaWVudE1vZGlmaWVyKGNyZWF0ZVRva2VuSW5mbyh0cmFuc2llbnRfS1cpKTsKKyAgICB7aWYgKHRydWUpIHJldHVybiByZXRWYWw7fQorICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7CisgIH0KKworICBmaW5hbCBwdWJsaWMgRW51bURlY2wgZW51bURlY2woQW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIEVudW1EZWNsIHJldFZhbCA9IG51bGw7CisgIFRva2VuIGVudW1fS1cgPSBudWxsOworICBUb2tlbiBuYW1lID0gbnVsbDsKKyAgVG9rZW4gbGN1cmx5ID0gbnVsbDsKKyAgRW51bUxpdGVyYWxzIGVudW1MaXRlcmFscyA9IG51bGw7CisgIFRva2VuIHJjdXJseSA9IG51bGw7CisgICAgZW51bV9LVyA9IGpqX2NvbnN1bWVfdG9rZW4oRU5VTUtXKTsKKyAgICBuYW1lID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgbGN1cmx5ID0gampfY29uc3VtZV90b2tlbihMQ1VSTFkpOworICAgIGVudW1MaXRlcmFscyA9IGVudW1MaXRlcmFscygpOworICAgIHJjdXJseSA9IGpqX2NvbnN1bWVfdG9rZW4oUkNVUkxZKTsKKyAgICByZXRWYWwgPSBuZXcgRW51bURlY2woYW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhlbnVtX0tXKSwgY3JlYXRlVG9rZW5JbmZvKG5hbWUpLCBjcmVhdGVUb2tlbkluZm8obGN1cmx5KSwgZW51bUxpdGVyYWxzLCBjcmVhdGVUb2tlbkluZm8ocmN1cmx5KSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHVibGljIEVudW1MaXRlcmFscyBlbnVtTGl0ZXJhbHMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBFbnVtTGl0ZXJhbHMgcmV0VmFsID0gbmV3IEVudW1MaXRlcmFscygpOworICBFbnVtTGl0ZXJhbCBlbnVtTGl0ZXJhbCA9IG51bGw7CisgICAgbGFiZWxfMTM6CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmIChqal8yXzczKDQpKSB7CisgICAgICAgIDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrIGxhYmVsXzEzOworICAgICAgfQorICAgICAgZW51bUxpdGVyYWwgPSBlbnVtTGl0ZXJhbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuYWRkQ2hpbGQoZW51bUxpdGVyYWwpOworICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBFbnVtTGl0ZXJhbCBlbnVtTGl0ZXJhbCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgIEVudW1MaXRlcmFsIHJldFZhbCA9IG51bGw7CisgIEFubm90YXRpb25zIGxlYWRpbmdBbm5vdGF0aW9ucyA9IG51bGw7CisgIFRva2VuIG5hbWUgPSBudWxsOworICBUb2tlbiBlcXVhbHMgPSBudWxsOworICBUb2tlbiB2YWwgPSBudWxsOworICBBbm5vdGF0aW9ucyB0cmFpbGluZ0Fubm90YXRpb25zID0gbnVsbDsKKyAgVG9rZW4gc2VtaSA9IG51bGw7CisgICAgbGVhZGluZ0Fubm90YXRpb25zID0gYW5ub3RhdGlvbnMoKTsKKyAgICBuYW1lID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgaWYgKGpqXzJfNzQoNCkpIHsKKyAgICAgIGVxdWFscyA9IGpqX2NvbnN1bWVfdG9rZW4oRVFVQUxTKTsKKyAgICAgIHZhbCA9IGpqX2NvbnN1bWVfdG9rZW4oSU5UX0xJVEVSQUwpOworICAgIH0gZWxzZSB7CisgICAgICA7CisgICAgfQorICAgIHRyYWlsaW5nQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucygpOworICAgIHNlbWkgPSBqal9jb25zdW1lX3Rva2VuKFNFTUkpOworICAgIHJldFZhbCA9IG5ldyBFbnVtTGl0ZXJhbChsZWFkaW5nQW5ub3RhdGlvbnMsIGNyZWF0ZVRva2VuSW5mbyhuYW1lKSwgY3JlYXRlVG9rZW5JbmZvKGVxdWFscyksIGNyZWF0ZVRva2VuSW5mbyh2YWwpLCB0cmFpbGluZ0Fubm90YXRpb25zLCBjcmVhdGVUb2tlbkluZm8oc2VtaSkpOworICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldFZhbDt9CisgICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBNYXBFbnRyeURlY2wgbWFwRW50cnlEZWNsKEFubm90YXRpb25zIGFubm90YXRpb25zKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICBNYXBFbnRyeURlY2wgcmV0VmFsID0gbnVsbDsKKyAgVG9rZW4gbWFwZW50cnlfS1cgPSBudWxsOworICBUb2tlbiBuYW1lID0gbnVsbDsKKyAgVG9rZW4gY29sb24gPSBudWxsOworICBUeXBlV2l0aE11bHRpIGtleSA9IG51bGw7CisgIFRva2VuIG1pbnVzX2d0ID0gbnVsbDsKKyAgVHlwZVdpdGhNdWx0aSB2YWx1ZSA9IG51bGw7CisgIFRva2VuIHNlbWkgPSBudWxsOworICAgIG1hcGVudHJ5X0tXID0gampfY29uc3VtZV90b2tlbihNQVBFTlRSWUtXKTsKKyAgICBuYW1lID0gampfY29uc3VtZV90b2tlbihJRCk7CisgICAgY29sb24gPSBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKKyAgICBrZXkgPSB0eXBlV2l0aE11bHRpKCk7CisgICAgbWludXNfZ3QgPSBqal9jb25zdW1lX3Rva2VuKE1JTlVTX0dUKTsKKyAgICB2YWx1ZSA9IHR5cGVXaXRoTXVsdGkoKTsKKyAgICBzZW1pID0gampfY29uc3VtZV90b2tlbihTRU1JKTsKKyAgICByZXRWYWwgPSBuZXcgTWFwRW50cnlEZWNsKGFubm90YXRpb25zLCBjcmVhdGVUb2tlbkluZm8obWFwZW50cnlfS1cpLCBjcmVhdGVUb2tlbkluZm8obmFtZSksIGNyZWF0ZVRva2VuSW5mbyhjb2xvbiksIGtleSwgY3JlYXRlVG9rZW5JbmZvKG1pbnVzX2d0KSwgdmFsdWUsIGNyZWF0ZVRva2VuSW5mbyhzZW1pKSk7CisgICAge2lmICh0cnVlKSByZXR1cm4gcmV0VmFsO30KKyAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzEoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgwLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDEsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzMoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMiwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl81KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzYoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM182KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzcoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg2LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl84KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfOCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDcsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzkoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM185KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoOCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTAoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xMCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDksIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzExKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTEoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxMCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTIoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xMigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDExLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xMyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzEzKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMTIsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzE0KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTQoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxMywgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTUoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xNSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDE0LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xNihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzE2KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMTUsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzE3KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTcoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxNiwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTgoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18xOCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDE3LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xOShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzE5KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMTgsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIwKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjAoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgxOSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjEoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yMSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDIwLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yMihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzIyKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjEsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIzKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjMoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyMiwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjQoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yNCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDIzLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yNShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzI1KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjQsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzI2KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjYoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyNSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjcoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18yNygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDI2LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yOChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzI4KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMjcsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzI5KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjkoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgyOCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzAoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zMCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDI5LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8zMShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzMxKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzAsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzMyKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzIoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzMSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzMoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zMygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDMyLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8zNChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzM0KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzMsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzM1KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzUoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzNCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzYoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zNigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDM1LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8zNyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzM3KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzYsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzM4KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfMzgoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSgzNywgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMzkoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM18zOSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDM4LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl80MChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQwKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoMzksIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzQxKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNDEoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg0MCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNDIoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM180MigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQxLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl80MyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQzKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNDIsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzQ0KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNDQoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg0MywgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNDUoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM180NSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQ0LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl80NihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQ2KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNDUsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzQ3KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNDcoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg0NiwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNDgoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM180OCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDQ3LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl80OShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzQ5KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNDgsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzUwKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNTAoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg0OSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNTEoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM181MSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDUwLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl81MihpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzUyKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNTEsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzUzKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNTMoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg1MiwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNTQoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM181NCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDUzLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl81NShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzU1KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNTQsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzU2KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNTYoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg1NSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNTcoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM181NygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDU2LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl81OChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzU4KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNTcsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzU5KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNTkoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg1OCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNjAoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM182MCgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDU5LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl82MShpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzYxKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNjAsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzYyKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNjIoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg2MSwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNjMoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM182MygpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDYyLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl82NChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzY0KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNjMsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzY1KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNjUoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg2NCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNjYoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM182NigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDY1LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl82NyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzY3KCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNjYsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzY4KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNjgoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg2NywgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNjkoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM182OSgpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDY4LCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl83MChpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzcwKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNjksIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzcxKGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNzEoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg3MCwgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNzIoaW50IHhsYSkgeworICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOworICAgIHRyeSB7IHJldHVybiAhampfM183MigpOyB9CisgICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGZpbmFsbHkgeyBqal9zYXZlKDcxLCB4bGEpOyB9CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl83MyhpbnQgeGxhKSB7CisgICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47CisgICAgdHJ5IHsgcmV0dXJuICFqal8zXzczKCk7IH0KKyAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9CisgICAgZmluYWxseSB7IGpqX3NhdmUoNzIsIHhsYSk7IH0KKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzc0KGludCB4bGEpIHsKKyAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKKyAgICB0cnkgeyByZXR1cm4gIWpqXzNfNzQoKTsgfQorICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBmaW5hbGx5IHsgampfc2F2ZSg3MywgeGxhKTsgfQorICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNjUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTUlOVVMpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDYoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfNjUoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJTlRfTElURVJBTCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzI1KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEFNUCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1RSSU5HX0xJVEVSQUwpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xNygpIHsKKyAgICBpZiAoampfM1JfMjcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzY0KCkgeworICAgIGlmIChqal8zUl8yOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18yNSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzUoKSB7CisgICAgaWYgKGpqXzNSXzE2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzY0KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEZBTFNFS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjkoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfNjMoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNjQoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzQoKSB7CisgICAgaWYgKGpqXzNSXzE1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzI0KCkgeworICAgIGlmIChqal8zUl8zMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM180NSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihIQVNIKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSUQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM182MygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihUUlVFS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTYoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfNCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM181KCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18zKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKERPTExBUikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NSgpIHsKKyAgICBpZiAoampfM1JfNjkoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVYVEVORFNLVykpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM18zKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKERPVCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzc0KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVRVUFMUykpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElOVF9MSVRFUkFMKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMSgpIHsKKyAgICBpZiAoampfM1JfMTQoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSUQpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM182OCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihUSFJPV1NLVykpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM182MigpIHsKKyAgICBpZiAoampfM1JfNDgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU1KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElEKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNfMSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzYxKCkgeworICAgIGlmIChqal8zUl80NygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM182MCgpIHsKKyAgICBpZiAoampfM1JfNDYoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNTkoKSB7CisgICAgaWYgKGpqXzNSXzQ1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MCgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM181OSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM182MCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM182MSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM182MigpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzAoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSUQpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18yNCgpKSBqal9zY2FucG9zID0geHNwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIzKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzMwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzU4KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElES1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjMoKSB7CisgICAgaWYgKGpqXzNSXzMwKCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzIzKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNTcoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUkVTT0xWRUtXKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNTYoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oT1JERVJFREtXKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNTUoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oVU5JUVVFS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM181NCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihERVJJVkVES1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM181MygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihVTlNFVFRBQkxFS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM181MigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihUUkFOU0lFTlRLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzUxKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFZPTEFUSUxFS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjgoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfNTAoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNTEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNTIoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNTMoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNTQoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNTUoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNTYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNTcoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNTgoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM181MCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSRUFET05MWUtXKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExUKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzYzKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKEdUKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNDkoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQkFORykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihNQVBFTlRSWUtXKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSUQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl81MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDQoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfNDkoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNjgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjIoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSU5URVJGQUNFS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM180OCgpIHsKKyAgICBpZiAoampfM1JfNDQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzYwKCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzIxKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzIyKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yMSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDTEFTU0tXKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzY1KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzQ4KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNDAoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UX0RPVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM182NygpIHsKKyAgICBpZiAoampfM1JfNDkoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNDcoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oVkFMS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjYoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfNDYoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNDcoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzQ2KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFJFRktXKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEFCU1RSQUNUS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTQoKSB7CisgICAgaWYgKGpqXzNSXzU4KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElEKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfNzQoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNTgoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIwKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzI5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzM3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVRVUFMUykpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl80MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjgoKSB7CisgICAgaWYgKGpqXzNSXzI5KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzIwKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM4KCkgeworICAgIGlmIChqal8zUl82NigpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNTAoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfNDUoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJRCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFNFTUkpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM183MygpIHsKKyAgICBpZiAoampfM1JfNTQoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzYyKCkgeworICAgIFRva2VuIHhzcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgeHNwID0gampfc2NhbnBvczsKKyAgICAgIGlmIChqal8zXzczKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTYoKSB7CisgICAgaWYgKGpqXzNSXzI2KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMigpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18xNigpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl82MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJRCkpIHJldHVybiB0cnVlOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMTcoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzE4KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18xOSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKExDVVJMWSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl82MSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSQ1VSTFkpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM180NCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJTlRfTElURVJBTCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzQzKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFFNQVJLKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVOVU1LVykpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElEKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oTENVUkxZKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzYyKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJDVVJMWSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzQyKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFBMVVMpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDMoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfNDEoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNDIoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNDMoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfNDQoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzkoKSB7CisgICAgaWYgKGpqXzNSXzQyKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzQxKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKFNUQVIpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18zOCgpIHsKKyAgICBpZiAoampfM1JfNDEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQyKCkgeworICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM180MCgpKSBqal9zY2FucG9zID0geHNwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzE5KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzI5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihUUkFOU0lFTlRLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihQQUNLQUdFS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJRCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExDVVJMWSkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl81OSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihSQ1VSTFkpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM183MigpIHsKKyAgICBpZiAoampfM1JfNTMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQxKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKExTUVVBUkUpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18zOSgpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal9zY2FuX3Rva2VuKFJTUVVBUkUpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjMoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfNzIoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihEQVRBVFlQRUtXKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oSUQpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl81NigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM185KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKElEKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oRVFVQUxTKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTUoKSB7CisgICAgaWYgKGpqXzNSXzI1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzE0KCkgeworICAgIGlmIChqal8zUl8yNCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xMygpIHsKKyAgICBpZiAoampfM1JfMjMoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTIoKSB7CisgICAgaWYgKGpqXzNSXzIyKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzExKCkgeworICAgIGlmIChqal8zUl8yMSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTAoKSB7CisgICAgaWYgKGpqXzNSXzI5KCkpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzM4KCkpIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwKCkgeworICAgIGlmIChqal8zUl81OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18xMSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM18xMigpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM18xMygpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM18xNCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM18xNSgpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTAoKSB7CisgICAgaWYgKGpqXzNSXzIwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MigpIHsKKyAgICBpZiAoampfM1JfNTgoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzY1KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl81MCgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJRCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl81OCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTkoKSB7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNfMTAoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzcoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQVRUUktXKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzUwKCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKElEKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMzcoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTRU1JKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNzEoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNTIoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ5KCkgeworICAgIGlmIChqal8zUl81MigpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM183MSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJTVBPUlRLVykpIHJldHVybiB0cnVlOworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzkoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM1JfNTYoKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSSkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzM2KCkgeworICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18zNSgpIHsKKyAgICBpZiAoampfM1JfMzgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMzQoKSB7CisgICAgaWYgKGpqXzNSXzM3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzgoKSB7CisgICAgaWYgKGpqXzNSXzE5KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MSgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihWT0lES1cpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzYoKSB7CisgICAgaWYgKGpqXzNSXzU4KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl82NSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18zNCgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM18zNSgpKSB7CisgICAgampfc2NhbnBvcyA9IHhzcDsKKyAgICBpZiAoampfM18zNigpKSByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzY2KCkgeworICAgIGlmIChqal8zUl8yNygpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yNigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8zMigpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihHVCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzMzKCkgeworICAgIGlmIChqal8zUl8zNigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM183MCgpIHsKKyAgICBpZiAoampfM1JfNTEoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNjkoKSB7CisgICAgaWYgKGpqXzNSXzUwKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82MSgpIHsKKyAgICBUb2tlbiB4c3A7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgICBpZiAoampfM18zMygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzMwKCkgeworICAgIGlmIChqal8zUl8zNSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfMjkoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzY3KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzY5KCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzcwKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTgoKSB7CisgICAgaWYgKGpqXzNSXzU2KCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKEVRVUFMUykpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl81NigpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18zMigpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihTVVBFUktXKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1KCkgeworICAgIFRva2VuIHhzcDsKKyAgICB4c3AgPSBqal9zY2FucG9zOworICAgIGlmIChqal8zXzMxKCkpIHsKKyAgICBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zXzMyKCkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM183KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzE4KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzMxKCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVYVEVORFNLVykpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81NygpIHsKKyAgICBpZiAoampfM1JfMTgoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM5KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKE9QS1cpKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM182NigpKSBqal9zY2FucG9zID0geHNwOworICAgIGlmIChqal8zUl82NygpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihJRCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzE4KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKEVYVEVORFNLVykpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl8yOCgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzQoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oUU1BUkspKSByZXR1cm4gdHJ1ZTsKKyAgICBUb2tlbiB4c3A7CisgICAgeHNwID0gampfc2NhbnBvczsKKyAgICBpZiAoampfM18zMCgpKSBqal9zY2FucG9zID0geHNwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNygpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihBVCkpIHJldHVybiB0cnVlOworICAgIGlmIChqal8zUl81NigpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfM1JfNTcoKSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjkoKSB7CisgICAgaWYgKGpqXzNSXzM0KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzI4KCkgeworICAgIGlmIChqal8zUl8yOSgpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzMoKSB7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMjgoKSkgeworICAgIGpqX3NjYW5wb3MgPSB4c3A7CisgICAgaWYgKGpqXzNfMjkoKSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzYoKSB7CisgICAgaWYgKGpqXzNSXzE3KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzI3KCkgeworICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGpqXzNSXzMzKCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80OCgpIHsKKyAgICBpZiAoampfc2Nhbl90b2tlbihDSEFSX0xJVEVSQUwpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTgoKSB7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNfNigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMigpIHsKKyAgICBpZiAoampfM1JfMzMoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICB4c3AgPSBqal9zY2FucG9zOworICAgICAgaWYgKGpqXzNfMjcoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDcoKSB7CisgICAgaWYgKGpqX3NjYW5fdG9rZW4oU1RSSU5HX0xJVEVSQUwpKSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTYoKSB7CisgICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOSgpIHsKKyAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7CisgICAgVG9rZW4geHNwOworICAgIHhzcCA9IGpqX3NjYW5wb3M7CisgICAgaWYgKGpqXzNfMjYoKSkgampfc2NhbnBvcyA9IHhzcDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgRW1mYXRpY1BhcnNlclRva2VuTWFuYWdlciB0b2tlbl9zb3VyY2U7CisgIFNpbXBsZUNoYXJTdHJlYW0gampfaW5wdXRfc3RyZWFtOworICBwdWJsaWMgVG9rZW4gdG9rZW4sIGpqX250OworICBwcml2YXRlIGludCBqal9udGs7CisgIHByaXZhdGUgVG9rZW4gampfc2NhbnBvcywgampfbGFzdHBvczsKKyAgcHJpdmF0ZSBpbnQgampfbGE7CisgIHB1YmxpYyBib29sZWFuIGxvb2tpbmdBaGVhZCA9IGZhbHNlOworICBwcml2YXRlIGJvb2xlYW4gampfc2VtTEE7CisgIHByaXZhdGUgaW50IGpqX2dlbjsKKyAgZmluYWwgcHJpdmF0ZSBpbnRbXSBqal9sYTEgPSBuZXcgaW50WzBdOworICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfMDsKKyAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzE7CisgIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV8yOworICBzdGF0aWMgeworICAgICAgampfbGExXzAoKTsKKyAgICAgIGpqX2xhMV8xKCk7CisgICAgICBqal9sYTFfMigpOworICAgfQorICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfMCgpIHsKKyAgICAgIGpqX2xhMV8wID0gbmV3IGludFtdIHt9OworICAgfQorICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfMSgpIHsKKyAgICAgIGpqX2xhMV8xID0gbmV3IGludFtdIHt9OworICAgfQorICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfMigpIHsKKyAgICAgIGpqX2xhMV8yID0gbmV3IGludFtdIHt9OworICAgfQorICBmaW5hbCBwcml2YXRlIEpKQ2FsbHNbXSBqal8yX3J0bnMgPSBuZXcgSkpDYWxsc1s3NF07CisgIHByaXZhdGUgYm9vbGVhbiBqal9yZXNjYW4gPSBmYWxzZTsKKyAgcHJpdmF0ZSBpbnQgampfZ2MgPSAwOworCisgIHB1YmxpYyBFbWZhdGljUGFyc2VyKGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgIHRoaXMoc3RyZWFtLCBudWxsKTsKKyAgfQorICBwdWJsaWMgRW1mYXRpY1BhcnNlcihqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKSB7CisgICAgdHJ5IHsgampfaW5wdXRfc3RyZWFtID0gbmV3IFNpbXBsZUNoYXJTdHJlYW0oc3RyZWFtLCBlbmNvZGluZywgMSwgMSk7IH0gY2F0Y2goamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IH0KKyAgICB0b2tlbl9zb3VyY2UgPSBuZXcgRW1mYXRpY1BhcnNlclRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOworICAgIHRva2VuID0gbmV3IFRva2VuKCk7CisgICAgampfbnRrID0gLTE7CisgICAgampfZ2VuID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDA7IGkrKykgampfbGExW2ldID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgUmVJbml0KHN0cmVhbSwgbnVsbCk7CisgIH0KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICB0cnkgeyBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgZW5jb2RpbmcsIDEsIDEpOyB9IGNhdGNoKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOyB9CisgICAgdG9rZW5fc291cmNlLlJlSW5pdChqal9pbnB1dF9zdHJlYW0pOworICAgIHRva2VuID0gbmV3IFRva2VuKCk7CisgICAgampfbnRrID0gLTE7CisgICAgampfZ2VuID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDA7IGkrKykgampfbGExW2ldID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7CisgIH0KKworICBwdWJsaWMgRW1mYXRpY1BhcnNlcihqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKKyAgICBqal9pbnB1dF9zdHJlYW0gPSBuZXcgU2ltcGxlQ2hhclN0cmVhbShzdHJlYW0sIDEsIDEpOworICAgIHRva2VuX3NvdXJjZSA9IG5ldyBFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyKGpqX2lucHV0X3N0cmVhbSk7CisgICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBqal9nZW4gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKKyAgICBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgMSwgMSk7CisgICAgdG9rZW5fc291cmNlLlJlSW5pdChqal9pbnB1dF9zdHJlYW0pOworICAgIHRva2VuID0gbmV3IFRva2VuKCk7CisgICAgampfbnRrID0gLTE7CisgICAgampfZ2VuID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDA7IGkrKykgampfbGExW2ldID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7CisgIH0KKworICBwdWJsaWMgRW1mYXRpY1BhcnNlcihFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyIHRtKSB7CisgICAgdG9rZW5fc291cmNlID0gdG07CisgICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBqal9nZW4gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlSW5pdChFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyIHRtKSB7CisgICAgdG9rZW5fc291cmNlID0gdG07CisgICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKKyAgICBqal9udGsgPSAtMTsKKyAgICBqal9nZW4gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgVG9rZW4gampfY29uc3VtZV90b2tlbihpbnQga2luZCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICBUb2tlbiBvbGRUb2tlbjsKKyAgICBpZiAoKG9sZFRva2VuID0gdG9rZW4pLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OworICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGlmICh0b2tlbi5raW5kID09IGtpbmQpIHsKKyAgICAgIGpqX2dlbisrOworICAgICAgaWYgKCsrampfZ2MgPiAxMDApIHsKKyAgICAgICAgampfZ2MgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIEpKQ2FsbHMgYyA9IGpqXzJfcnRuc1tpXTsKKyAgICAgICAgICB3aGlsZSAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoYy5nZW4gPCBqal9nZW4pIGMuZmlyc3QgPSBudWxsOworICAgICAgICAgICAgYyA9IGMubmV4dDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisgICAgdG9rZW4gPSBvbGRUb2tlbjsKKyAgICBqal9raW5kID0ga2luZDsKKyAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7CisgIH0KKworICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMb29rYWhlYWRTdWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yIHsgfQorICBmaW5hbCBwcml2YXRlIExvb2thaGVhZFN1Y2Nlc3MgampfbHMgPSBuZXcgTG9va2FoZWFkU3VjY2VzcygpOworICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfc2Nhbl90b2tlbihpbnQga2luZCkgeworICAgIGlmIChqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHsKKyAgICAgIGpqX2xhLS07CisgICAgICBpZiAoampfc2NhbnBvcy5uZXh0ID09IG51bGwpIHsKKyAgICAgICAgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKKyAgICB9CisgICAgaWYgKGpqX3Jlc2NhbikgeworICAgICAgaW50IGkgPSAwOyBUb2tlbiB0b2sgPSB0b2tlbjsKKyAgICAgIHdoaWxlICh0b2sgIT0gbnVsbCAmJiB0b2sgIT0gampfc2NhbnBvcykgeyBpKys7IHRvayA9IHRvay5uZXh0OyB9CisgICAgICBpZiAodG9rICE9IG51bGwpIGpqX2FkZF9lcnJvcl90b2tlbihraW5kLCBpKTsKKyAgICB9CisgICAgaWYgKGpqX3NjYW5wb3Mua2luZCAhPSBraW5kKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoampfbGEgPT0gMCAmJiBqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHRocm93IGpqX2xzOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKSB7CisgICAgaWYgKHRva2VuLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OworICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOworICAgIGpqX250ayA9IC0xOworICAgIGpqX2dlbisrOworICAgIHJldHVybiB0b2tlbjsKKyAgfQorCisgIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXRUb2tlbihpbnQgaW5kZXgpIHsKKyAgICBUb2tlbiB0ID0gbG9va2luZ0FoZWFkID8gampfc2NhbnBvcyA6IHRva2VuOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgeworICAgICAgaWYgKHQubmV4dCAhPSBudWxsKSB0ID0gdC5uZXh0OworICAgICAgZWxzZSB0ID0gdC5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOworICAgIH0KKyAgICByZXR1cm4gdDsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgaW50IGpqX250aygpIHsKKyAgICBpZiAoKGpqX250PXRva2VuLm5leHQpID09IG51bGwpCisgICAgICByZXR1cm4gKGpqX250ayA9ICh0b2tlbi5uZXh0PXRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKSkua2luZCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIChqal9udGsgPSBqal9udC5raW5kKTsKKyAgfQorCisgIHByaXZhdGUgamF2YS51dGlsLlZlY3RvcjxpbnRbXT4gampfZXhwZW50cmllcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yPGludFtdPigpOworICBwcml2YXRlIGludFtdIGpqX2V4cGVudHJ5OworICBwcml2YXRlIGludCBqal9raW5kID0gLTE7CisgIHByaXZhdGUgaW50W10gampfbGFzdHRva2VucyA9IG5ldyBpbnRbMTAwXTsKKyAgcHJpdmF0ZSBpbnQgampfZW5kcG9zOworCisgIHByaXZhdGUgdm9pZCBqal9hZGRfZXJyb3JfdG9rZW4oaW50IGtpbmQsIGludCBwb3MpIHsKKyAgICBpZiAocG9zID49IDEwMCkgcmV0dXJuOworICAgIGlmIChwb3MgPT0gampfZW5kcG9zICsgMSkgeworICAgICAgampfbGFzdHRva2Vuc1tqal9lbmRwb3MrK10gPSBraW5kOworICAgIH0gZWxzZSBpZiAoampfZW5kcG9zICE9IDApIHsKKyAgICAgIGpqX2V4cGVudHJ5ID0gbmV3IGludFtqal9lbmRwb3NdOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9lbmRwb3M7IGkrKykgeworICAgICAgICBqal9leHBlbnRyeVtpXSA9IGpqX2xhc3R0b2tlbnNbaV07CisgICAgICB9CisgICAgICBib29sZWFuIGV4aXN0cyA9IGZhbHNlOworICAgICAgZm9yIChqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IGpqX2V4cGVudHJpZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgaW50W10gb2xkZW50cnkgPSAoaW50W10pKGUubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIGlmIChvbGRlbnRyeS5sZW5ndGggPT0gampfZXhwZW50cnkubGVuZ3RoKSB7CisgICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2V4cGVudHJ5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAob2xkZW50cnlbaV0gIT0gampfZXhwZW50cnlbaV0pIHsKKyAgICAgICAgICAgICAgZXhpc3RzID0gZmFsc2U7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZXhpc3RzKSBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFleGlzdHMpIGpqX2V4cGVudHJpZXMuYWRkRWxlbWVudChqal9leHBlbnRyeSk7CisgICAgICBpZiAocG9zICE9IDApIGpqX2xhc3R0b2tlbnNbKGpqX2VuZHBvcyA9IHBvcykgLSAxXSA9IGtpbmQ7CisgICAgfQorICB9CisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKSB7CisgICAgampfZXhwZW50cmllcy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgIGJvb2xlYW5bXSBsYTF0b2tlbnMgPSBuZXcgYm9vbGVhbls3Ml07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3MjsgaSsrKSB7CisgICAgICBsYTF0b2tlbnNbaV0gPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGpqX2tpbmQgPj0gMCkgeworICAgICAgbGExdG9rZW5zW2pqX2tpbmRdID0gdHJ1ZTsKKyAgICAgIGpqX2tpbmQgPSAtMTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAwOyBpKyspIHsKKyAgICAgIGlmIChqal9sYTFbaV0gPT0gampfZ2VuKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7IGorKykgeworICAgICAgICAgIGlmICgoampfbGExXzBbaV0gJiAoMTw8aikpICE9IDApIHsKKyAgICAgICAgICAgIGxhMXRva2Vuc1tqXSA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoampfbGExXzFbaV0gJiAoMTw8aikpICE9IDApIHsKKyAgICAgICAgICAgIGxhMXRva2Vuc1szMitqXSA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgoampfbGExXzJbaV0gJiAoMTw8aikpICE9IDApIHsKKyAgICAgICAgICAgIGxhMXRva2Vuc1s2NCtqXSA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNzI7IGkrKykgeworICAgICAgaWYgKGxhMXRva2Vuc1tpXSkgeworICAgICAgICBqal9leHBlbnRyeSA9IG5ldyBpbnRbMV07CisgICAgICAgIGpqX2V4cGVudHJ5WzBdID0gaTsKKyAgICAgICAgampfZXhwZW50cmllcy5hZGRFbGVtZW50KGpqX2V4cGVudHJ5KTsKKyAgICAgIH0KKyAgICB9CisgICAgampfZW5kcG9zID0gMDsKKyAgICBqal9yZXNjYW5fdG9rZW4oKTsKKyAgICBqal9hZGRfZXJyb3JfdG9rZW4oMCwgMCk7CisgICAgaW50W11bXSBleHB0b2tzZXEgPSBuZXcgaW50W2pqX2V4cGVudHJpZXMuc2l6ZSgpXVtdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZXhwZW50cmllcy5zaXplKCk7IGkrKykgeworICAgICAgZXhwdG9rc2VxW2ldID0gKGludFtdKWpqX2V4cGVudHJpZXMuZWxlbWVudEF0KGkpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKHRva2VuLCBleHB0b2tzZXEsIHRva2VuSW1hZ2UpOworICB9CisKKyAgZmluYWwgcHVibGljIHZvaWQgZW5hYmxlX3RyYWNpbmcoKSB7CisgIH0KKworICBmaW5hbCBwdWJsaWMgdm9pZCBkaXNhYmxlX3RyYWNpbmcoKSB7CisgIH0KKworICBmaW5hbCBwcml2YXRlIHZvaWQgampfcmVzY2FuX3Rva2VuKCkgeworICAgIGpqX3Jlc2NhbiA9IHRydWU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3NDsgaSsrKSB7CisgICAgdHJ5IHsKKyAgICAgIEpKQ2FsbHMgcCA9IGpqXzJfcnRuc1tpXTsKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKHAuZ2VuID4gampfZ2VuKSB7CisgICAgICAgICAgampfbGEgPSBwLmFyZzsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBwLmZpcnN0OworICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgY2FzZSAwOiBqal8zXzEoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IGpqXzNfMigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogampfM18zKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiBqal8zXzQoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6IGpqXzNfNSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTogampfM182KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OiBqal8zXzcoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6IGpqXzNfOCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODogampfM185KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA5OiBqal8zXzEwKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDogampfM18xMSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTE6IGpqXzNfMTIoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyOiBqal8zXzEzKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzogampfM18xNCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ6IGpqXzNfMTUoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OiBqal8zXzE2KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjogampfM18xNygpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTc6IGpqXzNfMTgoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4OiBqal8zXzE5KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOTogampfM18yMCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjA6IGpqXzNfMjEoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxOiBqal8zXzIyKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjogampfM18yMygpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjM6IGpqXzNfMjQoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OiBqal8zXzI1KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNTogampfM18yNigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjY6IGpqXzNfMjcoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3OiBqal8zXzI4KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyODogampfM18yOSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjk6IGpqXzNfMzAoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMwOiBqal8zXzMxKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMTogampfM18zMigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI6IGpqXzNfMzMoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMzOiBqal8zXzM0KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNDogampfM18zNSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzU6IGpqXzNfMzYoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM2OiBqal8zXzM3KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNzogampfM18zOCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzg6IGpqXzNfMzkoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM5OiBqal8zXzQwKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MDogampfM180MSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDE6IGpqXzNfNDIoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQyOiBqal8zXzQzKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MzogampfM180NCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDQ6IGpqXzNfNDUoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ1OiBqal8zXzQ2KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NjogampfM180NygpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDc6IGpqXzNfNDgoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ4OiBqal8zXzQ5KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OTogampfM181MCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTA6IGpqXzNfNTEoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUxOiBqal8zXzUyKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MjogampfM181MygpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTM6IGpqXzNfNTQoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU0OiBqal8zXzU1KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NTogampfM181NigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTY6IGpqXzNfNTcoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU3OiBqal8zXzU4KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA1ODogampfM181OSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTk6IGpqXzNfNjAoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYwOiBqal8zXzYxKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MTogampfM182MigpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjI6IGpqXzNfNjMoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYzOiBqal8zXzY0KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NDogampfM182NSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjU6IGpqXzNfNjYoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY2OiBqal8zXzY3KCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NzogampfM182OCgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjg6IGpqXzNfNjkoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY5OiBqal8zXzcwKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MDogampfM183MSgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzE6IGpqXzNfNzIoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcyOiBqal8zXzczKCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MzogampfM183NCgpOyBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcCA9IHAubmV4dDsKKyAgICAgIH0gd2hpbGUgKHAgIT0gbnVsbCk7CisgICAgICB9IGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgfQorICAgIH0KKyAgICBqal9yZXNjYW4gPSBmYWxzZTsKKyAgfQorCisgIGZpbmFsIHByaXZhdGUgdm9pZCBqal9zYXZlKGludCBpbmRleCwgaW50IHhsYSkgeworICAgIEpKQ2FsbHMgcCA9IGpqXzJfcnRuc1tpbmRleF07CisgICAgd2hpbGUgKHAuZ2VuID4gampfZ2VuKSB7CisgICAgICBpZiAocC5uZXh0ID09IG51bGwpIHsgcCA9IHAubmV4dCA9IG5ldyBKSkNhbGxzKCk7IGJyZWFrOyB9CisgICAgICBwID0gcC5uZXh0OworICAgIH0KKyAgICBwLmdlbiA9IGpqX2dlbiArIHhsYSAtIGpqX2xhOyBwLmZpcnN0ID0gdG9rZW47IHAuYXJnID0geGxhOworICB9CisKKyAgc3RhdGljIGZpbmFsIGNsYXNzIEpKQ2FsbHMgeworICAgIGludCBnZW47CisgICAgVG9rZW4gZmlyc3Q7CisgICAgaW50IGFyZzsKKyAgICBKSkNhbGxzIG5leHQ7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL3BhcnNlci9FbWZhdGljUGFyc2VyQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vcGFyc2VyL0VtZmF0aWNQYXJzZXJDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYThlZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL3BhcnNlci9FbWZhdGljUGFyc2VyQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gRW1mYXRpY1BhcnNlckNvbnN0YW50cy5qYXZhICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4ucGFyc2VyOworCitwdWJsaWMgaW50ZXJmYWNlIEVtZmF0aWNQYXJzZXJDb25zdGFudHMgeworCisgIGludCBFT0YgPSAwOworICBpbnQgU0lOR0xFTElORUNPTU1FTlQgPSAxOworICBpbnQgV1MgPSAyOworICBpbnQgUEFDS0FHRUtXID0gNjsKKyAgaW50IENMQVNTS1cgPSA3OworICBpbnQgSU1QT1JUS1cgPSA4OworICBpbnQgQUJTVFJBQ1RLVyA9IDk7CisgIGludCBJTlRFUkZBQ0VLVyA9IDEwOworICBpbnQgRVhURU5EU0tXID0gMTE7CisgIGludCBTVVBFUktXID0gMTI7CisgIGludCBBVFRSS1cgPSAxMzsKKyAgaW50IFJFRktXID0gMTQ7CisgIGludCBWQUxLVyA9IDE1OworICBpbnQgUkVBRE9OTFlLVyA9IDE2OworICBpbnQgVk9MQVRJTEVLVyA9IDE3OworICBpbnQgVFJBTlNJRU5US1cgPSAxODsKKyAgaW50IFVOU0VUVEFCTEVLVyA9IDE5OworICBpbnQgREVSSVZFREtXID0gMjA7CisgIGludCBVTklRVUVLVyA9IDIxOworICBpbnQgT1JERVJFREtXID0gMjI7CisgIGludCBSRVNPTFZFS1cgPSAyMzsKKyAgaW50IElES1cgPSAyNDsKKyAgaW50IFRSVUVLVyA9IDI1OworICBpbnQgRkFMU0VLVyA9IDI2OworICBpbnQgT1BLVyA9IDI3OworICBpbnQgVk9JREtXID0gMjg7CisgIGludCBEQVRBVFlQRUtXID0gMjk7CisgIGludCBFTlVNS1cgPSAzMDsKKyAgaW50IE1BUEVOVFJZS1cgPSAzMTsKKyAgaW50IFRIUk9XU0tXID0gMzI7CisgIGludCBET1VCTEVTTEFTSCA9IDMzOworICBpbnQgRE9VQkxFUVVPVEUgPSAzNDsKKyAgaW50IFNJTkdMRVFVT1RFID0gMzU7CisgIGludCBCQUNLU0xBU0ggPSAzNjsKKyAgaW50IExDVVJMWSA9IDM3OworICBpbnQgUkNVUkxZID0gMzg7CisgIGludCBMU1FVQVJFID0gMzk7CisgIGludCBSU1FVQVJFID0gNDA7CisgIGludCBMUEFSRU4gPSA0MTsKKyAgaW50IFJQQVJFTiA9IDQyOworICBpbnQgRE9UID0gNDM7CisgIGludCBDT01NQSA9IDQ0OworICBpbnQgQ09MT04gPSA0NTsKKyAgaW50IFNFTUkgPSA0NjsKKyAgaW50IFNUQVIgPSA0NzsKKyAgaW50IFBMVVMgPSA0ODsKKyAgaW50IE1JTlVTID0gNDk7CisgIGludCBFUVVBTFMgPSA1MDsKKyAgaW50IFFNQVJLID0gNTE7CisgIGludCBCQU5HID0gNTI7CisgIGludCBET0xMQVIgPSA1MzsKKyAgaW50IEhBU0ggPSA1NDsKKyAgaW50IEFUID0gNTU7CisgIGludCBET1RfRE9UID0gNTY7CisgIGludCBNSU5VU19HVCA9IDU3OworICBpbnQgR1RfTFQgPSA1ODsKKyAgaW50IExUX0dUID0gNTk7CisgIGludCBBTVAgPSA2MDsKKyAgaW50IExUID0gNjE7CisgIGludCBHVCA9IDYyOworICBpbnQgU1RSSU5HX0xJVEVSQUwgPSA2MzsKKyAgaW50IENIQVJfTElURVJBTCA9IDY0OworICBpbnQgTEVUVEVST1JVTkRFUlNDT1JFID0gNjU7CisgIGludCBMRVRURVJPUlVOREVSU0NPUkVPUkRJR0lUID0gNjY7CisgIGludCBJTlRfTElURVJBTCA9IDY3OworICBpbnQgRElHSVQgPSA2ODsKKyAgaW50IEVTQyA9IDY5OworICBpbnQgRElHSVRESUdJVERJR0lUID0gNzA7CisgIGludCBJRCA9IDcxOworCisgIGludCBERUZBVUxUID0gMDsKKyAgaW50IFdpdGhpbkNvbW1lbnQgPSAxOworCisgIFN0cmluZ1tdIHRva2VuSW1hZ2UgPSB7CisgICAgIjxFT0Y+IiwKKyAgICAiPFNJTkdMRUxJTkVDT01NRU5UPiIsCisgICAgIjxXUz4iLAorICAgICJcIi8qXCIiLAorICAgICJcIiovXCIiLAorICAgICI8dG9rZW4gb2Yga2luZCA1PiIsCisgICAgIlwicGFja2FnZVwiIiwKKyAgICAiXCJjbGFzc1wiIiwKKyAgICAiXCJpbXBvcnRcIiIsCisgICAgIlwiYWJzdHJhY3RcIiIsCisgICAgIlwiaW50ZXJmYWNlXCIiLAorICAgICJcImV4dGVuZHNcIiIsCisgICAgIlwic3VwZXJcIiIsCisgICAgIlwiYXR0clwiIiwKKyAgICAiXCJyZWZcIiIsCisgICAgIlwidmFsXCIiLAorICAgICJcInJlYWRvbmx5XCIiLAorICAgICJcInZvbGF0aWxlXCIiLAorICAgICJcInRyYW5zaWVudFwiIiwKKyAgICAiXCJ1bnNldHRhYmxlXCIiLAorICAgICJcImRlcml2ZWRcIiIsCisgICAgIlwidW5pcXVlXCIiLAorICAgICJcIm9yZGVyZWRcIiIsCisgICAgIlwicmVzb2x2ZVwiIiwKKyAgICAiXCJpZFwiIiwKKyAgICAiXCJ0cnVlXCIiLAorICAgICJcImZhbHNlXCIiLAorICAgICJcIm9wXCIiLAorICAgICJcInZvaWRcIiIsCisgICAgIlwiZGF0YXR5cGVcIiIsCisgICAgIlwiZW51bVwiIiwKKyAgICAiXCJtYXBlbnRyeVwiIiwKKyAgICAiXCJ0aHJvd3NcIiIsCisgICAgIlwiLy9cIiIsCisgICAgIlwiXFxcIlwiIiwKKyAgICAiXCJcXFwnXCIiLAorICAgICJcIlxcXFxcIiIsCisgICAgIlwie1wiIiwKKyAgICAiXCJ9XCIiLAorICAgICJcIltcIiIsCisgICAgIlwiXVwiIiwKKyAgICAiXCIoXCIiLAorICAgICJcIilcIiIsCisgICAgIlwiLlwiIiwKKyAgICAiXCIsXCIiLAorICAgICJcIjpcIiIsCisgICAgIlwiO1wiIiwKKyAgICAiXCIqXCIiLAorICAgICJcIitcIiIsCisgICAgIlwiLVwiIiwKKyAgICAiXCI9XCIiLAorICAgICJcIj9cIiIsCisgICAgIlwiIVwiIiwKKyAgICAiXCIkXCIiLAorICAgICJcIiNcIiIsCisgICAgIlwiQFwiIiwKKyAgICAiXCIuLlwiIiwKKyAgICAiXCItPlwiIiwKKyAgICAiXCI+PFwiIiwKKyAgICAiXCI8PlwiIiwKKyAgICAiXCImXCIiLAorICAgICJcIjxcIiIsCisgICAgIlwiPlwiIiwKKyAgICAiPFNUUklOR19MSVRFUkFMPiIsCisgICAgIjxDSEFSX0xJVEVSQUw+IiwKKyAgICAiPExFVFRFUk9SVU5ERVJTQ09SRT4iLAorICAgICI8TEVUVEVST1JVTkRFUlNDT1JFT1JESUdJVD4iLAorICAgICI8SU5UX0xJVEVSQUw+IiwKKyAgICAiPERJR0lUPiIsCisgICAgIjxFU0M+IiwKKyAgICAiPERJR0lURElHSVRESUdJVD4iLAorICAgICI8SUQ+IiwKKyAgfTsKKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL3BhcnNlci9FbWZhdGljUGFyc2VyRHJpdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vcGFyc2VyL0VtZmF0aWNQYXJzZXJEcml2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGVmYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL3BhcnNlci9FbWZhdGljUGFyc2VyRHJpdmVyLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDkuMDIuMjAwNyAxMzowMzowNQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJhdG9yLmVjb3JlLkJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmF0b3IuZWNvcmUuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJhdG9yLmVjb3JlLkVtZmF0aWNTZW1hbnRpY1dhcm5pbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQ29tcFVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUucGFyc2VyLklQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUucGFyc2VyLlBhcnNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5wYXJzZXIuUGFyc2VFcnJvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5wYXJzZXIuUGFyc2VNZXNzYWdlOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY1BhcnNlckRyaXZlciBpbXBsZW1lbnRzIElQYXJzZXIgeworCisgICAgcHVibGljIFBhcnNlQ29udGV4dCBwYXJzZShSZWFkZXIgaW5wdXQpIHsKKyAgICAJCisgICAgCUV4dFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtID0gbmV3IEV4dFNpbXBsZUNoYXJTdHJlYW0oaW5wdXQpOworICAgIAlFeHRFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyIHRva2VuTWFuYWdlciA9IG5ldyBFeHRFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyKHN0cmVhbSk7CisgICAgCUVtZmF0aWNQYXJzZXIgcGFyc2VyID0gbmV3IEVtZmF0aWNQYXJzZXIodG9rZW5NYW5hZ2VyKTsKKyAgICAJUGFyc2VDb250ZXh0IHBhcnNlQ29udGV4dCA9IG5ldyBQYXJzZUNvbnRleHQoKTsKKyAgICAJQ29tcFVuaXQgY29tcFVuaXQgPSBwYXJzZUNvbXBVbml0KHBhcnNlciwgcGFyc2VDb250ZXh0KTsKKyAgICAJaWYgKGNvbXBVbml0ICE9IG51bGwpIHsKKwkJCUVQYWNrYWdlIHJvb3RQYWNrYWdlID0gYWRkRXJyb3JzRnJvbUFTVChwYXJzZUNvbnRleHQpOworCQkJLy8gZm9yIGNvbnN1bXB0aW9uIGJ5IGNoYW5nZSBsaXN0ZW5lcnMgKG5vdGlmaWVkIGJ5IHRoZSBlZGl0b3IpCisJCQljb21wVW5pdC5zZXRBU1Qocm9vdFBhY2thZ2UpOworCQl9CisgICAgCQorICAgIAlpZiAocGFyc2VDb250ZXh0LmdldE1lc3NhZ2VDb3VudCgpID09IDApIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiUGFyc2UgT0shIik7CisJCX0KKwkJZWxzZSB7CisJCQlQYXJzZU1lc3NhZ2VbXSBtc2dzID0gcGFyc2VDb250ZXh0LmdldE1lc3NhZ2VzKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4obXNnc1tpXS5nZXRNZXNzYWdlKCkpOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gcGFyc2VDb250ZXh0OworICAgIH0KKyAgICAKKyAgICAJcHJpdmF0ZSBFUGFja2FnZSBhZGRFcnJvcnNGcm9tQVNUKFBhcnNlQ29udGV4dCBwYXJzZUNvbnRleHQpIHsKKwkJRVBhY2thZ2Ugcm9vdFBhY2thZ2UgPSBudWxsOworCQkvLyB3YXJuaWducyBhbmQgZXJyb3JzIGNvbXB1dGVkIG5vdCBmcm9tIHRoZSBDU1QgYnV0IGZyb20gdGhlIEFTVAorCQlCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpOworCQlOdWxsUHJvZ3Jlc3NNb25pdG9yIG5wbSA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOworCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoImR1bW15Iik7CisJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKKwkJdHJ5IHsKKwkJCWJ1aWxkZXIuYnVpbGQocGFyc2VDb250ZXh0LCByZXNvdXJjZSwgbnBtKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlpZiAoIXBhcnNlQ29udGV4dC5oYXNFcnJvcnMoKSkgeworCQkJQ29ubmVjdG9yIGNvbm5lY3RvciA9IG5ldyBDb25uZWN0b3IoYnVpbGRlcik7CisJCQljb25uZWN0b3IuY29ubmVjdChwYXJzZUNvbnRleHQsIHJlc291cmNlLCBucG0pOworCQkJcm9vdFBhY2thZ2UgPSAoRVBhY2thZ2UpIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOworCQkJaWYgKHJvb3RQYWNrYWdlICE9IG51bGwpIHsKKwkJCQkvLyBpbnZva2UgRWNvcmVWYWxpZGF0b3IKKwkJCQlEaWFnbm9zdGljaWFuIGRpYWdub3N0aWNpYW4gPSBuZXcgRGlhZ25vc3RpY2lhbigpOworCQkJCWZpbmFsIERpYWdub3N0aWMgZGlhZ25vc3RpYyA9IGRpYWdub3N0aWNpYW4udmFsaWRhdGUocm9vdFBhY2thZ2UpOworCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgPT0gRGlhZ25vc3RpYy5PSykgeworCQkJCQlyZXR1cm4gcm9vdFBhY2thZ2U7CisJCQkJfQorCQkJCS8qCisJCQkJICogQSB0dXRvcmlhbCBvbiBtYXJrZXJzOgorCQkJCSAqIAorCQkJCSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1NYXJrJTIwTXklMjBXb3Jkcy9tYXJrLW15LXdvcmRzLmh0bWwKKwkJCQkgKiAKKwkJCQkgKi8KKworCQkJCUNvbXBVbml0IGNvbXBVbml0ID0gKENvbXBVbml0KSBwYXJzZUNvbnRleHQuZ2V0UGFyc2VSb290KCk7CisJCQkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKSkgeworCQkJCQlTZXQ8QVNUTm9kZT4gcHJvYmxlbU5vZGVzID0gbmV3IEhhc2hTZXQ8QVNUTm9kZT4oKTsKKwkJCQkJU3RyaW5nIGRNc2cgPSBjaGlsZERpYWdub3N0aWMuZ2V0TWVzc2FnZSgpOworCQkJCQlpZiAoY2hpbGREaWFnbm9zdGljLmdldERhdGEoKS5zaXplKCkgPiAwKSB7CisJCQkJCQlPYmplY3QgcHJpbWFyeVNvdXJjZU9mUHJvYmxlbSA9IGNoaWxkRGlhZ25vc3RpYy5nZXREYXRhKCkuZ2V0KDApOworCQkJCQkJaWYgKHByaW1hcnlTb3VyY2VPZlByb2JsZW0gIT0gbnVsbCAmJiBwcmltYXJ5U291cmNlT2ZQcm9ibGVtIGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJCQkJCVNldDxBU1ROb2RlPiBjc3RVc2VzID0gY29tcFVuaXQuZ2V0RWNvcmVEZWNsMkNzdFVzZSgpLmdldCgoRU9iamVjdCkgcHJpbWFyeVNvdXJjZU9mUHJvYmxlbSk7CisJCQkJCQkJcHJvYmxlbU5vZGVzLmFkZEFsbChjc3RVc2VzKTsKKwkJCQkJCQlpZiAocHJvYmxlbU5vZGVzLnNpemUoKSA9PSAwKSB7CisJCQkJCQkJCXByb2JsZW1Ob2Rlcy5hZGQoY29tcFVuaXQuZ2V0UGFja2FnZURlY2woKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWZvciAoQVNUTm9kZSBwcm9ibGVtTm9kZSA6IHByb2JsZW1Ob2RlcykgeworCQkJCQkJUGFyc2VNZXNzYWdlIHBNc2cgPSBuZXcgRW1mYXRpY1NlbWFudGljV2FybmluZy5FY29yZVZhbGlkYXRvckRpYWdub3N0aWMocHJvYmxlbU5vZGUsIGRNc2cpOworCQkJCQkJcGFyc2VDb250ZXh0LmFkZFBhcnNlTWVzc2FnZShwTXNnKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcm9vdFBhY2thZ2U7CisJfQorICAgIAorICAgIHByaXZhdGUgQ29tcFVuaXQgcGFyc2VDb21wVW5pdChFbWZhdGljUGFyc2VyIHBhcnNlciwgUGFyc2VDb250ZXh0IHBhcnNlQ29udGV4dCkgeworICAgIAl0cnkgeworCQkJQ29tcFVuaXQgY29tcFVuaXQgPSBwYXJzZXIuY29tcFVuaXQoKTsKKwkJCXBhcnNlQ29udGV4dC5zZXRQYXJzZVJvb3QoY29tcFVuaXQpOworCQkJcmV0dXJuIGNvbXBVbml0OworCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBleCkgeworCQkJUGFyc2VFcnJvciBwYXJzZUVycm9yOworCQkJVG9rZW4gdG9rZW4gPSBleC5jdXJyZW50VG9rZW47CisJCQlpZiAodG9rZW4gaW5zdGFuY2VvZiBFeHRUb2tlbikgeworCQkJCUV4dFRva2VuIGV4dFRva2VuID0gKEV4dFRva2VuKSB0b2tlbjsKKwkJCQlpbnQgb2Zmc2V0ID0gZXh0VG9rZW4udG9rZW5PZmZzZXQ7CisJCQkJU3RyaW5nIHRva2VuVGV4dCA9IHRva2VuLmltYWdlOworCQkJCWludCBsZW5ndGggPSAodG9rZW5UZXh0ID09IG51bGwpID8gMCA6IHRva2VuVGV4dC5sZW5ndGgoKTsKKwkJCQlwYXJzZUVycm9yID0gbmV3IFBhcnNlRXJyb3IoZXguZ2V0TWVzc2FnZSgpLCBvZmZzZXQsIGxlbmd0aCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwYXJzZUVycm9yID0gbmV3IFBhcnNlRXJyb3IoZXguZ2V0TWVzc2FnZSgpLCAxKTsKKwkJCX0KKwkJCXBhcnNlQ29udGV4dC5hZGRQYXJzZU1lc3NhZ2UocGFyc2VFcnJvcik7CisJCX0KKwkJY2F0Y2ggKFRva2VuTWdyRXJyb3IgZXgpIHsKKwkJCVBhcnNlRXJyb3IgcGFyc2VFcnJvciA9IG5ldyBQYXJzZUVycm9yKGV4LmdldE1lc3NhZ2UoKSwgMSk7CisJCQlwYXJzZUNvbnRleHQuYWRkUGFyc2VNZXNzYWdlKHBhcnNlRXJyb3IpOworCQl9CisJCXJldHVybiBudWxsOyAKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vcGFyc2VyL0VtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9wYXJzZXIvRW1mYXRpY1BhcnNlclRva2VuTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOWZlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vcGFyc2VyL0VtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEwNTUgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gRW1mYXRpY1BhcnNlclRva2VuTWFuYWdlci5qYXZhICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4ucGFyc2VyOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY1BhcnNlclRva2VuTWFuYWdlciBpbXBsZW1lbnRzIEVtZmF0aWNQYXJzZXJDb25zdGFudHMKK3sKKyAgcHVibGljICBqYXZhLmlvLlByaW50U3RyZWFtIGRlYnVnU3RyZWFtID0gU3lzdGVtLm91dDsKKyAgcHVibGljICB2b2lkIHNldERlYnVnU3RyZWFtKGphdmEuaW8uUHJpbnRTdHJlYW0gZHMpIHsgZGVidWdTdHJlYW0gPSBkczsgfQorcHJpdmF0ZSBmaW5hbCBpbnQgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKGludCBwb3MsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIHN3aXRjaCAocG9zKQorICAgeworICAgICAgY2FzZSAwOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4TCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MWZmZmZmZmMwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzE7CisgICAgICAgICAgICByZXR1cm4gMjY7CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDkwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiAyNjsKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MWY2ZmZmZmMwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzE7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOworICAgICAgICAgICAgcmV0dXJuIDI2OworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSAyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhjMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gMjY7CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDFmNmZmM2ZjMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDcxOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKKyAgICAgICAgICAgIHJldHVybiAyNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NTIwMDIwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiAyNjsKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MWE0ZmYxZmMwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzE7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAzOworICAgICAgICAgICAgcmV0dXJuIDI2OworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSA0OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAxMDgwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gMjY7CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDFhMGZmMGY0MEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDcxOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKKyAgICAgICAgICAgIHJldHVybiAyNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMjAwMTAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gMjY7CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGEwZGYwZTQwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzE7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA1OworICAgICAgICAgICAgcmV0dXJuIDI2OworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSA2OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhhMDBmMDYwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDcxOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNjsKKyAgICAgICAgICAgIHJldHVybiAyNjsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ZDAwODQwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gMjY7CisgICAgICAgICByZXR1cm4gLTE7CisgICAgICBjYXNlIDc6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGEwMDMwMjAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gMjY7CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGMwNDAwTCkgIT0gMEwpCisgICAgICAgICB7CisgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzE7CisgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA3OworICAgICAgICAgICAgcmV0dXJuIDI2OworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIC0xOworICAgICAgY2FzZSA4OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDQwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIDI2OworICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMEwpICE9IDBMKQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDcxOworICAgICAgICAgICAgamptYXRjaGVkUG9zID0gODsKKyAgICAgICAgICAgIHJldHVybiAyNjsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgcmV0dXJuIC0xOworICAgfQorfQorcHJpdmF0ZSBmaW5hbCBpbnQgampTdGFydE5mYV8wKGludCBwb3MsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIHJldHVybiBqak1vdmVOZmFfMChqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAocG9zLCBhY3RpdmUwKSwgcG9zICsgMSk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqalN0b3BBdFBvcyhpbnQgcG9zLCBpbnQga2luZCkKK3sKKyAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOworICAgamptYXRjaGVkUG9zID0gcG9zOworICAgcmV0dXJuIHBvcyArIDE7Cit9Citwcml2YXRlIGZpbmFsIGludCBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKGludCBwb3MsIGludCBraW5kLCBpbnQgc3RhdGUpCit7CisgICBqam1hdGNoZWRLaW5kID0ga2luZDsKKyAgIGpqbWF0Y2hlZFBvcyA9IHBvczsKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHJldHVybiBwb3MgKyAxOyB9CisgICByZXR1cm4gampNb3ZlTmZhXzAoc3RhdGUsIHBvcyArIDEpOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpCit7CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgMzM6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNTIpOworICAgICAgY2FzZSAzNToKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA1NCk7CisgICAgICBjYXNlIDM2OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDUzKTsKKyAgICAgIGNhc2UgMzg6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNjApOworICAgICAgY2FzZSA0MDoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA0MSk7CisgICAgICBjYXNlIDQxOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDQyKTsKKyAgICAgIGNhc2UgNDI6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNDcpOworICAgICAgY2FzZSA0MzoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA0OCk7CisgICAgICBjYXNlIDQ0OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDQ0KTsKKyAgICAgIGNhc2UgNDU6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gNDk7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDAwMDAwMDAwMDAwMEwpOworICAgICAgY2FzZSA0NjoKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0MzsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDAwMDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDQ3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4TCk7CisgICAgICBjYXNlIDU4OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDQ1KTsKKyAgICAgIGNhc2UgNTk6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNDYpOworICAgICAgY2FzZSA2MDoKKyAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA2MTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODAwMDAwMDAwMDAwMDAwTCk7CisgICAgICBjYXNlIDYxOgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDUwKTsKKyAgICAgIGNhc2UgNjI6CisgICAgICAgICBqam1hdGNoZWRLaW5kID0gNjI7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMDAwMDAwMDAwMEwpOworICAgICAgY2FzZSA2MzoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA1MSk7CisgICAgICBjYXNlIDY0OgorICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDU1KTsKKyAgICAgIGNhc2UgOTE6CisgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzkpOworICAgICAgY2FzZSA5MzoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA0MCk7CisgICAgICBjYXNlIDk3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMjAwTCk7CisgICAgICBjYXNlIDk5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MEwpOworICAgICAgY2FzZSAxMDA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMTAwMDAwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDA4MDBMKTsKKyAgICAgIGNhc2UgMTAyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDAwMDAwTCk7CisgICAgICBjYXNlIDEwNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDUwMEwpOworICAgICAgY2FzZSAxMDk6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDAwMDAwTCk7CisgICAgICBjYXNlIDExMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODQwMDAwMEwpOworICAgICAgY2FzZSAxMTI6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwTCk7CisgICAgICBjYXNlIDExNDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODE0MDAwTCk7CisgICAgICBjYXNlIDExNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMjA0MDAwMEwpOworICAgICAgY2FzZSAxMTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDI4MDAwMEwpOworICAgICAgY2FzZSAxMTg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDI4MDAwTCk7CisgICAgICBjYXNlIDEyMzoKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzNyk7CisgICAgICBjYXNlIDEyNToKKyAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzOCk7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKKyAgIH0KK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAobG9uZyBhY3RpdmUwKQoreworICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgwLCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDQyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4TCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMyk7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDY6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDU2KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2MDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgNTgpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDYyOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA1Nyk7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgNTkpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDk3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHhhNDAwODA0MEwpOworICAgICAgY2FzZSA5ODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwTCk7CisgICAgICBjYXNlIDEwMDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgMjQsIDI2KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDkxNDAwMEwpOworICAgICAgY2FzZSAxMDQ6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDAwMDAwMEwpOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDgwTCk7CisgICAgICBjYXNlIDEwOToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwTCk7CisgICAgICBjYXNlIDExMDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4NDAyODA0MDBMKTsKKyAgICAgIGNhc2UgMTExOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAyMDAwMEwpOworICAgICAgY2FzZSAxMTI6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDI3LCAyNik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTE0OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyNDQwMDAwTCk7CisgICAgICBjYXNlIDExNjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwMEwpOworICAgICAgY2FzZSAxMTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDBMKTsKKyAgICAgIGNhc2UgMTIwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg4MDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDAsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgwLCBvbGQwKTsgCisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDEsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDI7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDUwMDgwTCk7CisgICAgICBjYXNlIDk5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg0MEwpOworICAgICAgY2FzZSAxMDA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDQwMDAwMEwpOworICAgICAgY2FzZSAxMDI6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDE0LCAyNik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgxMDIwMDAwMEwpOworICAgICAgY2FzZSAxMDg6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDE1LCAyNik7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDQwMjAwMDBMKTsKKyAgICAgIGNhc2UgMTEyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg4MDAwMTEwMEwpOworICAgICAgY2FzZSAxMTQ6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDEwMDEwMDAwMEwpOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDg4MDIwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDIwMDAyYzAwTCk7CisgICAgICBjYXNlIDExNzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4NDIwMDAwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDEsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxLCBvbGQwKTsgCisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDIsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDM7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwMDIwMDAwTCk7CisgICAgICBjYXNlIDEwMDoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDI4LCAyNik7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDEwMDAwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMjUsIDI2KTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4ODA0ODFjMDBMKTsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxMDAwMDBMKTsKKyAgICAgIGNhc2UgMTA3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg0MEwpOworICAgICAgY2FzZSAxMDk6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCAzMCwgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExMDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4NDAwMDBMKTsKKyAgICAgIGNhc2UgMTExOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxMDA4MDAxMDBMKTsKKyAgICAgIGNhc2UgMTEzOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDAwMDBMKTsKKyAgICAgIGNhc2UgMTE0OgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCAxMywgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExNToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4NDAwMDA4MEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwMEwpOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBqalN0YXJ0TmZhXzAoMiwgYWN0aXZlMCk7Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQoreworICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCisgICAgICByZXR1cm4gampTdGFydE5mYV8wKDIsIG9sZDApOyAKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMywgYWN0aXZlMCk7CisgICAgICByZXR1cm4gNDsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA5NzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4NDBMKTsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCAyNiwgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4ODAwMDAwTCk7CisgICAgICBjYXNlIDExMDoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4ODAwMDA4MDBMKTsKKyAgICAgIGNhc2UgMTExOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgxMDAwMEwpOworICAgICAgY2FzZSAxMTQ6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDEyLCAyNik7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDQwMDcwMEwpOworICAgICAgY2FzZSAxMTU6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCA3LCAyNik7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDQwMDAwTCk7CisgICAgICBjYXNlIDExNjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MjAwYTAwMDBMKTsKKyAgICAgIGNhc2UgMTE3OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgyMDAwMDBMKTsKKyAgICAgIGNhc2UgMTE4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgxMDAwMDBMKTsKKyAgICAgIGNhc2UgMTE5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgxMDAwMDAwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDMsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgzLCBvbGQwKTsgCisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDQsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDU7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDIwMEwpOworICAgICAgY2FzZSAxMDA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDgwMEwpOworICAgICAgY2FzZSAxMDE6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgMjEsIDI2KTsKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4NTAwMDAwTCk7CisgICAgICBjYXNlIDEwMjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4NDAwTCk7CisgICAgICBjYXNlIDEwMzoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4NDBMKTsKKyAgICAgIGNhc2UgMTA1OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg2MDAwMEwpOworICAgICAgY2FzZSAxMTA6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDEwMDAwTCk7CisgICAgICBjYXNlIDExNToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCAzMiwgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExNjoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCA4LCAyNik7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDgwMDgwMDAwTCk7CisgICAgICBjYXNlIDExODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4ODAwMDAwTCk7CisgICAgICBjYXNlIDEyMToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4MjAwMDAwMDBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDQsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg0LCBvbGQwKTsgCisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDUsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDY7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgOTc6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDgwNDAwTCk7CisgICAgICBjYXNlIDk5OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHgyMDBMKTsKKyAgICAgIGNhc2UgMTAwOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDIwLCAyNik7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCAyMiwgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDYsIDI2KTsKKyAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg4MDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDIzLCAyNik7CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDQwMDAwTCk7CisgICAgICBjYXNlIDEwODoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4MzAwMDBMKTsKKyAgICAgIGNhc2UgMTEyOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHgyMDAwMDAwMEwpOworICAgICAgY2FzZSAxMTQ6CisgICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDgwMDAwMDAwTCk7CisgICAgICBjYXNlIDExNToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCAxMSwgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg1LCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNSwgb2xkMCk7IAorICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg2LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiA3OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDk4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE4XzAoYWN0aXZlMCwgMHg4MDAwMEwpOworICAgICAgY2FzZSA5OToKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOF8wKGFjdGl2ZTAsIDB4NDAwTCk7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDE3LCAyNik7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDI5LCAyNik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTEwOgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE4XzAoYWN0aXZlMCwgMHg0MDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMEwpICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNywgOSwgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEyMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDE2LCAyNik7CisgICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDMxLCAyNik7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDYsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKK3sKKyAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQorICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg2LCBvbGQwKTsgCisgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDcsIGFjdGl2ZTApOworICAgICAgcmV0dXJuIDg7CisgICB9CisgICBzd2l0Y2goY3VyQ2hhcikKKyAgIHsKKyAgICAgIGNhc2UgMTAxOgorICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDgsIDEwLCAyNik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTA4OgorICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE5XzAoYWN0aXZlMCwgMHg4MDAwMEwpOworICAgICAgY2FzZSAxMTY6CisgICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwTCkgIT0gMEwpCisgICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg4LCAxOCwgMjYpOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIGpqU3RhcnROZmFfMCg3LCBhY3RpdmUwKTsKK30KK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE5XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCit7CisgICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKKyAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNywgb2xkMCk7IAorICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9CisgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg4LCBhY3RpdmUwKTsKKyAgICAgIHJldHVybiA5OworICAgfQorICAgc3dpdGNoKGN1ckNoYXIpCisgICB7CisgICAgICBjYXNlIDEwMToKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDksIDE5LCAyNik7CisgICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm4gampTdGFydE5mYV8wKDgsIGFjdGl2ZTApOworfQorcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkKGludCBzdGF0ZSkKK3sKKyAgIGlmIChqanJvdW5kc1tzdGF0ZV0gIT0gampyb3VuZCkKKyAgIHsKKyAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IHN0YXRlOworICAgICAgampyb3VuZHNbc3RhdGVdID0gampyb3VuZDsKKyAgIH0KK30KK3ByaXZhdGUgZmluYWwgdm9pZCBqakFkZFN0YXRlcyhpbnQgc3RhcnQsIGludCBlbmQpCit7CisgICBkbyB7CisgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBqam5leHRTdGF0ZXNbc3RhcnRdOworICAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOworfQorcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKGludCBzdGF0ZTEsIGludCBzdGF0ZTIpCit7CisgICBqakNoZWNrTkFkZChzdGF0ZTEpOworICAgampDaGVja05BZGQoc3RhdGUyKTsKK30KK3ByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFN0YXRlcyhpbnQgc3RhcnQsIGludCBlbmQpCit7CisgICBkbyB7CisgICAgICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnRdKTsKKyAgIH0gd2hpbGUgKHN0YXJ0KysgIT0gZW5kKTsKK30KK3ByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFN0YXRlcyhpbnQgc3RhcnQpCit7CisgICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnRdKTsKKyAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydCArIDFdKTsKK30KK3N0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMwID0geworICAgMHgwTCwgMHgwTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTAorfTsKK3ByaXZhdGUgZmluYWwgaW50IGpqTW92ZU5mYV8wKGludCBzdGFydFN0YXRlLCBpbnQgY3VyUG9zKQoreworICAgaW50W10gbmV4dFN0YXRlczsKKyAgIGludCBzdGFydHNBdCA9IDA7CisgICBqam5ld1N0YXRlQ250ID0gMjc7CisgICBpbnQgaSA9IDE7CisgICBqanN0YXRlU2V0WzBdID0gc3RhcnRTdGF0ZTsKKyAgIGludCBqLCBraW5kID0gMHg3ZmZmZmZmZjsKKyAgIGZvciAoOzspCisgICB7CisgICAgICBpZiAoKytqanJvdW5kID09IDB4N2ZmZmZmZmYpCisgICAgICAgICBSZUluaXRSb3VuZHMoKTsKKyAgICAgIGlmIChjdXJDaGFyIDwgNjQpCisgICAgICB7CisgICAgICAgICBsb25nIGwgPSAxTCA8PCBjdXJDaGFyOworICAgICAgICAgTWF0Y2hMb29wOiBkbworICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY3KQorICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY3OworICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMjMpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKDB4MTAwMDAzNjAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyKQorICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI7CisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg2KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzkpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygwLCAxKTsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzQpCisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyLCA0KTsKKyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gNDcpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NykKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDUsIDcpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZmZmZmZGJmZkwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDUsIDcpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMCAmJiBraW5kID4gMSkKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAxOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMykKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDM7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgxMDAwMDM2MDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMikKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyOworICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM0KQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMiwgNCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg4NDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMiwgNCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmJmZmZmZmZmZkwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIsIDQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzQgJiYga2luZCA+IDYzKQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDYzOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEzOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDE0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIsIDQpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygwLCAxKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg4NDAwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTgpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkgJiYga2luZCA+IDY0KQorICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY0OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDIwOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDIxOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE4KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmY3ZmZmZmZmZmZmTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTgpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NykKKyAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NzsKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDIzKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzE7CisgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyNjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPCAxMjgpCisgICAgICB7CisgICAgICAgICBsb25nIGwgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7CisgICAgICAgICBNYXRjaExvb3A6IGRvCisgICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmU4N2ZmZmZmZUwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzEpCisgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzE7CisgICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgyNik7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDEyNikKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcyg1LCA3KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCisgICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcyg4LCA5KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgaWYgKCgweDE0NDA0MDEwMDAwMDAwTCAmIGwpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMiwgNCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyLCA0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTAsIDExKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHgxNDQwNDAxMDAwMDAwMEwgJiBsKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE4KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE4KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEyNikKKyAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI1OworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlODdmZmZmZmVMICYgbCkgPT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzEpCisgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzE7CisgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgyNik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpbnQgaTIgPSAoY3VyQ2hhciAmIDB4ZmYpID4+IDY7CisgICAgICAgICBsb25nIGwyID0gMUwgPDwgKGN1ckNoYXIgJiAwNzcpOworICAgICAgICAgTWF0Y2hMb29wOiBkbworICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgIGlmICgoampiaXRWZWMwW2kyXSAmIGwyKSAhPSAwTCkKKyAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDUsIDcpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgaWYgKChqamJpdFZlYzBbaTJdICYgbDIpICE9IDBMKQorICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMiwgNCk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMl0gJiBsMikgIT0gMEwpCisgICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxODsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKKyAgICAgIH0KKyAgICAgIGlmIChraW5kICE9IDB4N2ZmZmZmZmYpCisgICAgICB7CisgICAgICAgICBqam1hdGNoZWRLaW5kID0ga2luZDsKKyAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IGN1clBvczsKKyAgICAgICAgIGtpbmQgPSAweDdmZmZmZmZmOworICAgICAgfQorICAgICAgKytjdXJQb3M7CisgICAgICBpZiAoKGkgPSBqam5ld1N0YXRlQ250KSA9PSAoc3RhcnRzQXQgPSAyNyAtIChqam5ld1N0YXRlQ250ID0gc3RhcnRzQXQpKSkKKyAgICAgICAgIHJldHVybiBjdXJQb3M7CisgICAgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KKyAgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyByZXR1cm4gY3VyUG9zOyB9CisgICB9Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMF8xKCkKK3sKKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA0MjoKKyAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8xKDB4MTBMKTsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAgcmV0dXJuIDE7CisgICB9Cit9Citwcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8xKGxvbmcgYWN0aXZlMCkKK3sKKyAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQorICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIHN3aXRjaChjdXJDaGFyKQorICAgeworICAgICAgY2FzZSA0NzoKKyAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTBMKSAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA0KTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgICByZXR1cm4gMjsKKyAgIH0KKyAgIHJldHVybiAyOworfQorc3RhdGljIGZpbmFsIGludFtdIGpqbmV4dFN0YXRlcyA9IHsKKyAgIDE2LCAyMiwgOCwgMTAsIDExLCAxLCAyLCA0LCA5LCAxMiwgMTcsIDE5LCAKK307CitwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGpqc3RyTGl0ZXJhbEltYWdlcyA9IHsKKyIiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiXDE2MFwxNDFcMTQzXDE1M1wxNDFcMTQ3XDE0NSIsIAorIlwxNDNcMTU0XDE0MVwxNjNcMTYzIiwgIlwxNTFcMTU1XDE2MFwxNTdcMTYyXDE2NCIsICJcMTQxXDE0MlwxNjNcMTY0XDE2MlwxNDFcMTQzXDE2NCIsIAorIlwxNTFcMTU2XDE2NFwxNDVcMTYyXDE0NlwxNDFcMTQzXDE0NSIsICJcMTQ1XDE3MFwxNjRcMTQ1XDE1NlwxNDRcMTYzIiwgIlwxNjNcMTY1XDE2MFwxNDVcMTYyIiwgIlwxNDFcMTY0XDE2NFwxNjIiLCAKKyJcMTYyXDE0NVwxNDYiLCAiXDE2NlwxNDFcMTU0IiwgIlwxNjJcMTQ1XDE0MVwxNDRcMTU3XDE1NlwxNTRcMTcxIiwgCisiXDE2NlwxNTdcMTU0XDE0MVwxNjRcMTUxXDE1NFwxNDUiLCAiXDE2NFwxNjJcMTQxXDE1NlwxNjNcMTUxXDE0NVwxNTZcMTY0IiwgCisiXDE2NVwxNTZcMTYzXDE0NVwxNjRcMTY0XDE0MVwxNDJcMTU0XDE0NSIsICJcMTQ0XDE0NVwxNjJcMTUxXDE2NlwxNDVcMTQ0IiwgIlwxNjVcMTU2XDE1MVwxNjFcMTY1XDE0NSIsIAorIlwxNTdcMTYyXDE0NFwxNDVcMTYyXDE0NVwxNDQiLCAiXDE2MlwxNDVcMTYzXDE1N1wxNTRcMTY2XDE0NSIsICJcMTUxXDE0NCIsICJcMTY0XDE2MlwxNjVcMTQ1IiwgCisiXDE0NlwxNDFcMTU0XDE2M1wxNDUiLCAiXDE1N1wxNjAiLCAiXDE2NlwxNTdcMTUxXDE0NCIsICJcMTQ0XDE0MVwxNjRcMTQxXDE2NFwxNzFcMTYwXDE0NSIsIAorIlwxNDVcMTU2XDE2NVwxNTUiLCAiXDE1NVwxNDFcMTYwXDE0NVwxNTZcMTY0XDE2MlwxNzEiLCAiXDE2NFwxNTBcMTYyXDE1N1wxNjdcMTYzIiwgbnVsbCwgbnVsbCwgCitudWxsLCBudWxsLCAiXDE3MyIsICJcMTc1IiwgIlwxMzMiLCAiXDEzNSIsICJcNTAiLCAiXDUxIiwgIlw1NiIsICJcNTQiLCAiXDcyIiwgCisiXDczIiwgIlw1MiIsICJcNTMiLCAiXDU1IiwgIlw3NSIsICJcNzciLCAiXDQxIiwgIlw0NCIsICJcNDMiLCAiXDEwMCIsICJcNTZcNTYiLCAKKyJcNTVcNzYiLCAiXDc2XDc0IiwgIlw3NFw3NiIsICJcNDYiLCAiXDc0IiwgIlw3NiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIAorbnVsbCwgbnVsbCwgbnVsbCwgfTsKK3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGV4U3RhdGVOYW1lcyA9IHsKKyAgICJERUZBVUxUIiwgCisgICAiV2l0aGluQ29tbWVudCIsIAorfTsKK3B1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gampuZXdMZXhTdGF0ZSA9IHsKKyAgIC0xLCAtMSwgLTEsIDEsIDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCisgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvVG9rZW4gPSB7CisgICAweGZmZmZmZmUxZmZmZmZmYzFMLCAweDg5TCwgCit9Oworc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvU2tpcCA9IHsKKyAgIDB4MWVMLCAweDBMLCAKK307CitzdGF0aWMgZmluYWwgbG9uZ1tdIGpqdG9Nb3JlID0geworICAgMHgyMEwsIDB4MEwsIAorfTsKK3Byb3RlY3RlZCBTaW1wbGVDaGFyU3RyZWFtIGlucHV0X3N0cmVhbTsKK3ByaXZhdGUgZmluYWwgaW50W10gampyb3VuZHMgPSBuZXcgaW50WzI3XTsKK3ByaXZhdGUgZmluYWwgaW50W10gampzdGF0ZVNldCA9IG5ldyBpbnRbNTRdOworcHJvdGVjdGVkIGNoYXIgY3VyQ2hhcjsKK3B1YmxpYyBFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyKFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtKXsKKyAgIGlmIChTaW1wbGVDaGFyU3RyZWFtLnN0YXRpY0ZsYWcpCisgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVSUk9SOiBDYW5ub3QgdXNlIGEgc3RhdGljIENoYXJTdHJlYW0gY2xhc3Mgd2l0aCBhIG5vbi1zdGF0aWMgbGV4aWNhbCBhbmFseXplci4iKTsKKyAgIGlucHV0X3N0cmVhbSA9IHN0cmVhbTsKK30KK3B1YmxpYyBFbWZhdGljUGFyc2VyVG9rZW5NYW5hZ2VyKFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtLCBpbnQgbGV4U3RhdGUpeworICAgdGhpcyhzdHJlYW0pOworICAgU3dpdGNoVG8obGV4U3RhdGUpOworfQorcHVibGljIHZvaWQgUmVJbml0KFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtKQoreworICAgamptYXRjaGVkUG9zID0gampuZXdTdGF0ZUNudCA9IDA7CisgICBjdXJMZXhTdGF0ZSA9IGRlZmF1bHRMZXhTdGF0ZTsKKyAgIGlucHV0X3N0cmVhbSA9IHN0cmVhbTsKKyAgIFJlSW5pdFJvdW5kcygpOworfQorcHJpdmF0ZSBmaW5hbCB2b2lkIFJlSW5pdFJvdW5kcygpCit7CisgICBpbnQgaTsKKyAgIGpqcm91bmQgPSAweDgwMDAwMDAxOworICAgZm9yIChpID0gMjc7IGktLSA+IDA7KQorICAgICAgampyb3VuZHNbaV0gPSAweDgwMDAwMDAwOworfQorcHVibGljIHZvaWQgUmVJbml0KFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtLCBpbnQgbGV4U3RhdGUpCit7CisgICBSZUluaXQoc3RyZWFtKTsKKyAgIFN3aXRjaFRvKGxleFN0YXRlKTsKK30KK3B1YmxpYyB2b2lkIFN3aXRjaFRvKGludCBsZXhTdGF0ZSkKK3sKKyAgIGlmIChsZXhTdGF0ZSA+PSAyIHx8IGxleFN0YXRlIDwgMCkKKyAgICAgIHRocm93IG5ldyBUb2tlbk1nckVycm9yKCJFcnJvcjogSWdub3JpbmcgaW52YWxpZCBsZXhpY2FsIHN0YXRlIDogIiArIGxleFN0YXRlICsgIi4gU3RhdGUgdW5jaGFuZ2VkLiIsIFRva2VuTWdyRXJyb3IuSU5WQUxJRF9MRVhJQ0FMX1NUQVRFKTsKKyAgIGVsc2UKKyAgICAgIGN1ckxleFN0YXRlID0gbGV4U3RhdGU7Cit9CisKK3Byb3RlY3RlZCBUb2tlbiBqakZpbGxUb2tlbigpCit7CisgICBUb2tlbiB0ID0gVG9rZW4ubmV3VG9rZW4oamptYXRjaGVkS2luZCk7CisgICB0LmtpbmQgPSBqam1hdGNoZWRLaW5kOworICAgU3RyaW5nIGltID0gampzdHJMaXRlcmFsSW1hZ2VzW2pqbWF0Y2hlZEtpbmRdOworICAgdC5pbWFnZSA9IChpbSA9PSBudWxsKSA/IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpIDogaW07CisgICB0LmJlZ2luTGluZSA9IGlucHV0X3N0cmVhbS5nZXRCZWdpbkxpbmUoKTsKKyAgIHQuYmVnaW5Db2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5Db2x1bW4oKTsKKyAgIHQuZW5kTGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7CisgICB0LmVuZENvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRFbmRDb2x1bW4oKTsKKyAgIHJldHVybiB0OworfQorCitpbnQgY3VyTGV4U3RhdGUgPSAwOworaW50IGRlZmF1bHRMZXhTdGF0ZSA9IDA7CitpbnQgampuZXdTdGF0ZUNudDsKK2ludCBqanJvdW5kOworaW50IGpqbWF0Y2hlZFBvczsKK2ludCBqam1hdGNoZWRLaW5kOworCitwdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkgCit7CisgIGludCBraW5kOworICBUb2tlbiBzcGVjaWFsVG9rZW4gPSBudWxsOworICBUb2tlbiBtYXRjaGVkVG9rZW47CisgIGludCBjdXJQb3MgPSAwOworCisgIEVPRkxvb3AgOgorICBmb3IgKDs7KQorICB7ICAgCisgICB0cnkgICAKKyAgIHsgICAgIAorICAgICAgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5CZWdpblRva2VuKCk7CisgICB9ICAgICAKKyAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKKyAgIHsgICAgICAgIAorICAgICAgamptYXRjaGVkS2luZCA9IDA7CisgICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOworICAgICAgcmV0dXJuIG1hdGNoZWRUb2tlbjsKKyAgIH0KKworICAgZm9yICg7OykKKyAgIHsKKyAgICAgc3dpdGNoKGN1ckxleFN0YXRlKQorICAgICB7CisgICAgICAgY2FzZSAwOgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7CisgICAgICAgICBqam1hdGNoZWRQb3MgPSAwOworICAgICAgICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpOworICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAxOgorICAgICAgICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7CisgICAgICAgICBqam1hdGNoZWRQb3MgPSAwOworICAgICAgICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMSgpOworICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA9PSAwICYmIGpqbWF0Y2hlZEtpbmQgPiA1KQorICAgICAgICAgeworICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDU7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgfQorICAgICBpZiAoamptYXRjaGVkS2luZCAhPSAweDdmZmZmZmZmKQorICAgICB7CisgICAgICAgIGlmIChqam1hdGNoZWRQb3MgKyAxIDwgY3VyUG9zKQorICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKGN1clBvcyAtIGpqbWF0Y2hlZFBvcyAtIDEpOworICAgICAgICBpZiAoKGpqdG9Ub2tlbltqam1hdGNoZWRLaW5kID4+IDZdICYgKDFMIDw8IChqam1hdGNoZWRLaW5kICYgMDc3KSkpICE9IDBMKQorICAgICAgICB7CisgICAgICAgICAgIG1hdGNoZWRUb2tlbiA9IGpqRmlsbFRva2VuKCk7CisgICAgICAgaWYgKGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF0gIT0gLTEpCisgICAgICAgICBjdXJMZXhTdGF0ZSA9IGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF07CisgICAgICAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGpqdG9Ta2lwW2pqbWF0Y2hlZEtpbmQgPj4gNl0gJiAoMUwgPDwgKGpqbWF0Y2hlZEtpbmQgJiAwNzcpKSkgIT0gMEwpCisgICAgICAgIHsKKyAgICAgICAgIGlmIChqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdICE9IC0xKQorICAgICAgICAgICBjdXJMZXhTdGF0ZSA9IGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF07CisgICAgICAgICAgIGNvbnRpbnVlIEVPRkxvb3A7CisgICAgICAgIH0KKyAgICAgIGlmIChqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdICE9IC0xKQorICAgICAgICBjdXJMZXhTdGF0ZSA9IGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF07CisgICAgICAgIGN1clBvcyA9IDA7CisgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOworICAgICAgICB0cnkgeworICAgICAgICAgICBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7CisgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7IH0KKyAgICAgfQorICAgICBpbnQgZXJyb3JfbGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7CisgICAgIGludCBlcnJvcl9jb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7CisgICAgIFN0cmluZyBlcnJvcl9hZnRlciA9IG51bGw7CisgICAgIGJvb2xlYW4gRU9GU2VlbiA9IGZhbHNlOworICAgICB0cnkgeyBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsgfQorICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlMSkgeworICAgICAgICBFT0ZTZWVuID0gdHJ1ZTsKKyAgICAgICAgZXJyb3JfYWZ0ZXIgPSBjdXJQb3MgPD0gMSA/ICIiIDogaW5wdXRfc3RyZWFtLkdldEltYWdlKCk7CisgICAgICAgIGlmIChjdXJDaGFyID09ICdcbicgfHwgY3VyQ2hhciA9PSAnXHInKSB7CisgICAgICAgICAgIGVycm9yX2xpbmUrKzsKKyAgICAgICAgICAgZXJyb3JfY29sdW1uID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgIGVycm9yX2NvbHVtbisrOworICAgICB9CisgICAgIGlmICghRU9GU2VlbikgeworICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOworICAgICAgICBlcnJvcl9hZnRlciA9IGN1clBvcyA8PSAxID8gIiIgOiBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKTsKKyAgICAgfQorICAgICB0aHJvdyBuZXcgVG9rZW5NZ3JFcnJvcihFT0ZTZWVuLCBjdXJMZXhTdGF0ZSwgZXJyb3JfbGluZSwgZXJyb3JfY29sdW1uLCBlcnJvcl9hZnRlciwgY3VyQ2hhciwgVG9rZW5NZ3JFcnJvci5MRVhJQ0FMX0VSUk9SKTsKKyAgIH0KKyAgfQorfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vcGFyc2VyL0V4dEVtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9wYXJzZXIvRXh0RW1mYXRpY1BhcnNlclRva2VuTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTIxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vcGFyc2VyL0V4dEVtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioKKyAqIEBnZW5lcmF0ZWQgYnkgR3ltbmFzdCBmcm9tIEVtZmF0aWMuYXN0IG9uIDA5LjAyLjIwMDcgMTM6MDM6MDUKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4ucGFyc2VyOworCitwdWJsaWMgY2xhc3MgRXh0RW1mYXRpY1BhcnNlclRva2VuTWFuYWdlciBleHRlbmRzIEVtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIgeworCisJcHJpdmF0ZSBmaW5hbCBFeHRTaW1wbGVDaGFyU3RyZWFtIF9zdHJlYW07CisJCisJcHVibGljIEV4dEVtZmF0aWNQYXJzZXJUb2tlbk1hbmFnZXIoRXh0U2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0pIHsKKwkJc3VwZXIoc3RyZWFtKTsKKwkJX3N0cmVhbSA9IHN0cmVhbTsKKwl9CisKKwlwcm90ZWN0ZWQgVG9rZW4gampGaWxsVG9rZW4oKSB7CisJCUV4dFRva2VuIHQgPSBuZXcgRXh0VG9rZW4oKTsKKwkJdC5raW5kID0gamptYXRjaGVkS2luZDsKKwkJU3RyaW5nIGltID0gampzdHJMaXRlcmFsSW1hZ2VzW2pqbWF0Y2hlZEtpbmRdOworCQl0LmltYWdlID0gKGltID09IG51bGwpID8gaW5wdXRfc3RyZWFtLkdldEltYWdlKCkgOiBpbTsKKwkJdC5iZWdpbkxpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5MaW5lKCk7CisJCXQuYmVnaW5Db2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5Db2x1bW4oKTsKKwkJdC5lbmRMaW5lID0gaW5wdXRfc3RyZWFtLmdldEVuZExpbmUoKTsKKwkJdC5lbmRDb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7CisJCXQudG9rZW5PZmZzZXQgPSBfc3RyZWFtLnRva2VuQmVnaW5PZmZzZXQ7CisJCXJldHVybiB0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL3BhcnNlci9FeHRTaW1wbGVDaGFyU3RyZWFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vcGFyc2VyL0V4dFNpbXBsZUNoYXJTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2Q5NGEyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL3BhcnNlci9FeHRTaW1wbGVDaGFyU3RyZWFtLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBAZ2VuZXJhdGVkIGJ5IEd5bW5hc3QgZnJvbSBFbWZhdGljLmFzdCBvbiAwOS4wMi4yMDA3IDEzOjAzOjA1CisgKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLnBhcnNlcjsKKworcHVibGljIGNsYXNzIEV4dFNpbXBsZUNoYXJTdHJlYW0gZXh0ZW5kcyBTaW1wbGVDaGFyU3RyZWFtIHsKKworCS8qKgorCSAqIFRoZSBjdXJyZW50IGNoYXJhY3RlciBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgc3RyZWFtLgorCSAqLworCXB1YmxpYyBpbnQgaW5wdXRPZmZzZXQgPSAtMTsKKwkKKwkvKioKKwkgKiBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgdG9rZW4gaW4gdGhlIGlucHV0IHN0cmVhbS4KKwkgKi8KKwlwdWJsaWMgaW50IHRva2VuQmVnaW5PZmZzZXQ7CisJCisJCisJcHVibGljIEV4dFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSkgeworCQlzdXBlcihkc3RyZWFtKTsKKwl9CisJCisJcHVibGljIGNoYXIgQmVnaW5Ub2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKwkJdG9rZW5CZWdpbiA9IC0xOworCQl0b2tlbkJlZ2luT2Zmc2V0ID0gLTE7CisJCQorCQljaGFyIGMgPSByZWFkQ2hhcigpOworCQkKKwkJdG9rZW5CZWdpbiA9IGJ1ZnBvczsKKwkJdG9rZW5CZWdpbk9mZnNldCA9IGlucHV0T2Zmc2V0OworCisJCXJldHVybiBjOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBVcGRhdGVMaW5lQ29sdW1uKGNoYXIgYykgeworCQlpbnB1dE9mZnNldCsrOworCQlzdXBlci5VcGRhdGVMaW5lQ29sdW1uKGMpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9wYXJzZXIvRXh0VG9rZW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9wYXJzZXIvRXh0VG9rZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWI1NDdkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL3BhcnNlci9FeHRUb2tlbi5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKKy8qKgorICogQGdlbmVyYXRlZCBieSBHeW1uYXN0IGZyb20gRW1mYXRpYy5hc3Qgb24gMDkuMDIuMjAwNyAxMzowMzowNQorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CisKK3B1YmxpYyBjbGFzcyBFeHRUb2tlbiBleHRlbmRzIFRva2VuIHsKKworCS8qKgorCSAqIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgdG9rZW4gaW4gdGhlIGlucHV0IHN0cmVhbS4KKwkgKi8KKwlwdWJsaWMgaW50IHRva2VuT2Zmc2V0OworCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vcGFyc2VyL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vcGFyc2VyL1BhcnNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0MzQ5NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9wYXJzZXIvUGFyc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBQYXJzZUV4Y2VwdGlvbi5qYXZhIFZlcnNpb24gMy4wICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4ucGFyc2VyOworCisvKioKKyAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHBhcnNlIGVycm9ycyBhcmUgZW5jb3VudGVyZWQuCisgKiBZb3UgY2FuIGV4cGxpY2l0bHkgY3JlYXRlIG9iamVjdHMgb2YgdGhpcyBleGNlcHRpb24gdHlwZSBieQorICogY2FsbGluZyB0aGUgbWV0aG9kIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24gaW4gdGhlIGdlbmVyYXRlZAorICogcGFyc2VyLgorICoKKyAqIFlvdSBjYW4gbW9kaWZ5IHRoaXMgY2xhc3MgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgcmVwb3J0aW5nCisgKiBtZWNoYW5pc21zIHNvIGxvbmcgYXMgeW91IHJldGFpbiB0aGUgcHVibGljIGZpZWxkcy4KKyAqLworcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAvKioKKyAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBtZXRob2QgImdlbmVyYXRlUGFyc2VFeGNlcHRpb24iCisgICAqIGluIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLiAgQ2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcworICAgKiBhIG5ldyBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpdGggdGhlIGZpZWxkcyAiY3VycmVudFRva2VuIiwKKyAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIHNldC4gIFRoZSBib29sZWFuCisgICAqIGZsYWcgInNwZWNpYWxDb25zdHJ1Y3RvciIgaXMgYWxzbyBzZXQgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0CisgICAqIHRoaXMgY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlIHRoaXMgb2JqZWN0LgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGl0cyBzdXBlciBjbGFzcyB3aXRoIHRoZSBlbXB0eSBzdHJpbmcKKyAgICogdG8gZm9yY2UgdGhlICJ0b1N0cmluZyIgbWV0aG9kIG9mIHBhcmVudCBjbGFzcyAiVGhyb3dhYmxlIiB0bworICAgKiBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBpbiB0aGUgZm9ybToKKyAgICogICAgIFBhcnNlRXhjZXB0aW9uOiA8cmVzdWx0IG9mIGdldE1lc3NhZ2U+CisgICAqLworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oVG9rZW4gY3VycmVudFRva2VuVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZVZhbAorICAgICAgICAgICAgICAgICAgICAgICApCisgIHsKKyAgICBzdXBlcigiIik7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gdHJ1ZTsKKyAgICBjdXJyZW50VG9rZW4gPSBjdXJyZW50VG9rZW5WYWw7CisgICAgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWw7CisgICAgdG9rZW5JbWFnZSA9IHRva2VuSW1hZ2VWYWw7CisgIH0KKworICAvKioKKyAgICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnMgYXJlIGZvciB1c2UgYnkgeW91IGZvciB3aGF0ZXZlcgorICAgKiBwdXJwb3NlIHlvdSBjYW4gdGhpbmsgb2YuICBDb25zdHJ1Y3RpbmcgdGhlIGV4Y2VwdGlvbiBpbiB0aGlzCisgICAqIG1hbm5lciBtYWtlcyB0aGUgZXhjZXB0aW9uIGJlaGF2ZSBpbiB0aGUgbm9ybWFsIHdheSAtIGkuZS4sIGFzCisgICAqIGRvY3VtZW50ZWQgaW4gdGhlIGNsYXNzICJUaHJvd2FibGUiLiAgVGhlIGZpZWxkcyAiZXJyb3JUb2tlbiIsCisgICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBkbyBub3QgY29udGFpbgorICAgKiByZWxldmFudCBpbmZvcm1hdGlvbi4gIFRoZSBKYXZhQ0MgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgdXNlCisgICAqIHRoZXNlIGNvbnN0cnVjdG9ycy4KKyAgICovCisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKCkgeworICAgIHN1cGVyKCk7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7CisgIH0KKworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHZhcmlhYmxlIGRldGVybWluZXMgd2hpY2ggY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlCisgICAqIHRoaXMgb2JqZWN0IGFuZCB0aGVyZWJ5IGFmZmVjdHMgdGhlIHNlbWFudGljcyBvZiB0aGUKKyAgICogImdldE1lc3NhZ2UiIG1ldGhvZCAoc2VlIGJlbG93KS4KKyAgICovCisgIHByb3RlY3RlZCBib29sZWFuIHNwZWNpYWxDb25zdHJ1Y3RvcjsKKworICAvKioKKyAgICogVGhpcyBpcyB0aGUgbGFzdCB0b2tlbiB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkIHN1Y2Nlc3NmdWxseS4gIElmCisgICAqIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQgZHVlIHRvIGEgcGFyc2UgZXJyb3IsIHRoZSB0b2tlbgorICAgKiBmb2xsb3duZyB0aGlzIHRva2VuIHdpbGwgKHRoZXJlZm9yZSkgYmUgdGhlIGZpcnN0IGVycm9yIHRva2VuLgorICAgKi8KKyAgcHVibGljIFRva2VuIGN1cnJlbnRUb2tlbjsKKworICAvKioKKyAgICogRWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5IGlzIGFuIGFycmF5IG9mIGludGVnZXJzLiAgRWFjaCBhcnJheQorICAgKiBvZiBpbnRlZ2VycyByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIChieSB0aGVpciBvcmRpbmFsCisgICAqIHZhbHVlcykgdGhhdCBpcyBleHBlY3RlZCBhdCB0aGlzIHBvaW50IG9mIHRoZSBwYXJzZS4KKyAgICovCisgIHB1YmxpYyBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXM7CisKKyAgLyoqCisgICAqIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlICJ0b2tlbkltYWdlIiBhcnJheSBvZiB0aGUgZ2VuZXJhdGVkCisgICAqIHBhcnNlciB3aXRoaW4gd2hpY2ggdGhlIHBhcnNlIGVycm9yIG9jY3VycmVkLiAgVGhpcyBhcnJheSBpcworICAgKiBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgLi4uQ29uc3RhbnRzIGludGVyZmFjZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSB0b2tlbkltYWdlOworCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCBoYXMgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIHdoZW4gdGhpcyBvYmplY3QgaGFzIGJlZW4KKyAgICogY3JlYXRlZCB1c2luZyB0aGUgc3RhbmRhcmQgY29uc3RydWN0b3JzLiAgT3RoZXJ3aXNlLCBpdCB1c2VzCisgICAqICJjdXJyZW50VG9rZW4iIGFuZCAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIgdG8gZ2VuZXJhdGUgYSBwYXJzZQorICAgKiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm5zIGl0LiAgSWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZAorICAgKiBkdWUgdG8gYSBwYXJzZSBlcnJvciwgYW5kIHlvdSBkbyBub3QgY2F0Y2ggaXQgKGl0IGdldHMgdGhyb3duCisgICAqIGZyb20gdGhlIHBhcnNlciksIHRoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyB0aGUgcHJpbnRpbmcKKyAgICogb2YgdGhlIGZpbmFsIHN0YWNrIHRyYWNlLCBhbmQgaGVuY2UgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZQorICAgKiBnZXRzIGRpc3BsYXllZC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICBpZiAoIXNwZWNpYWxDb25zdHJ1Y3RvcikgeworICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKKyAgICB9CisgICAgU3RyaW5nQnVmZmVyIGV4cGVjdGVkID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGludCBtYXhTaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChtYXhTaXplIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGgpIHsKKyAgICAgICAgbWF4U2l6ZSA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOworICAgICAgfQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsgaisrKSB7CisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCh0b2tlbkltYWdlW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bal1dKS5hcHBlbmQoIiAiKTsKKyAgICAgIH0KKyAgICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoIC0gMV0gIT0gMCkgeworICAgICAgICBleHBlY3RlZC5hcHBlbmQoIi4uLiIpOworICAgICAgfQorICAgICAgZXhwZWN0ZWQuYXBwZW5kKGVvbCkuYXBwZW5kKCIgICAgIik7CisgICAgfQorICAgIFN0cmluZyByZXR2YWwgPSAiRW5jb3VudGVyZWQgXCIiOworICAgIFRva2VuIHRvayA9IGN1cnJlbnRUb2tlbi5uZXh0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U2l6ZTsgaSsrKSB7CisgICAgICBpZiAoaSAhPSAwKSByZXR2YWwgKz0gIiAiOworICAgICAgaWYgKHRvay5raW5kID09IDApIHsKKyAgICAgICAgcmV0dmFsICs9IHRva2VuSW1hZ2VbMF07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dmFsICs9IGFkZF9lc2NhcGVzKHRvay5pbWFnZSk7CisgICAgICB0b2sgPSB0b2submV4dDsgCisgICAgfQorICAgIHJldHZhbCArPSAiXCIgYXQgbGluZSAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5MaW5lICsgIiwgY29sdW1uICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkNvbHVtbjsKKyAgICByZXR2YWwgKz0gIi4iICsgZW9sOworICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aCA9PSAxKSB7CisgICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmc6IiArIGVvbCArICIgICAgIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nIG9uZSBvZjoiICsgZW9sICsgIiAgICAiOworICAgIH0KKyAgICByZXR2YWwgKz0gZXhwZWN0ZWQudG9TdHJpbmcoKTsKKyAgICByZXR1cm4gcmV0dmFsOworICB9CisKKyAgLyoqCisgICAqIFRoZSBlbmQgb2YgbGluZSBzdHJpbmcgZm9yIHRoaXMgbWFjaGluZS4KKyAgICovCisgIHByb3RlY3RlZCBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOworIAorICAvKioKKyAgICogVXNlZCB0byBjb252ZXJ0IHJhdyBjaGFyYWN0ZXJzIHRvIHRoZWlyIGVzY2FwZWQgdmVyc2lvbgorICAgKiB3aGVuIHRoZXNlIHJhdyB2ZXJzaW9uIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgYW4gQVNDSUkKKyAgICogc3RyaW5nIGxpdGVyYWwuCisgICAqLworICBwcm90ZWN0ZWQgU3RyaW5nIGFkZF9lc2NhcGVzKFN0cmluZyBzdHIpIHsKKyAgICAgIFN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICBjaGFyIGNoOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgeworICAgICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgY2FzZSAwIDoKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xiJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdCIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xmJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcciIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcXCIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCB8fCBjaCA+IDB4N2UpIHsKKyAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7CisgICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOworICAgfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vcGFyc2VyL1NpbXBsZUNoYXJTdHJlYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9wYXJzZXIvU2ltcGxlQ2hhclN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTU4MTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvbGFuZy9nZW4vcGFyc2VyL1NpbXBsZUNoYXJTdHJlYW0uamF2YQpAQCAtMCwwICsxLDQzOSBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBTaW1wbGVDaGFyU3RyZWFtLmphdmEgVmVyc2lvbiA0LjAgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXI7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlIENoYXJTdHJlYW0sIHdoZXJlIHRoZSBzdHJlYW0gaXMgYXNzdW1lZCB0bworICogY29udGFpbiBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMgKHdpdGhvdXQgdW5pY29kZSBwcm9jZXNzaW5nKS4KKyAqLworCitwdWJsaWMgY2xhc3MgU2ltcGxlQ2hhclN0cmVhbQoreworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3RhdGljRmxhZyA9IGZhbHNlOworICBpbnQgYnVmc2l6ZTsKKyAgaW50IGF2YWlsYWJsZTsKKyAgaW50IHRva2VuQmVnaW47CisgIHB1YmxpYyBpbnQgYnVmcG9zID0gLTE7CisgIHByb3RlY3RlZCBpbnQgYnVmbGluZVtdOworICBwcm90ZWN0ZWQgaW50IGJ1ZmNvbHVtbltdOworCisgIHByb3RlY3RlZCBpbnQgY29sdW1uID0gMDsKKyAgcHJvdGVjdGVkIGludCBsaW5lID0gMTsKKworICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0xGID0gZmFsc2U7CisKKyAgcHJvdGVjdGVkIGphdmEuaW8uUmVhZGVyIGlucHV0U3RyZWFtOworCisgIHByb3RlY3RlZCBjaGFyW10gYnVmZmVyOworICBwcm90ZWN0ZWQgaW50IG1heE5leHRDaGFySW5kID0gMDsKKyAgcHJvdGVjdGVkIGludCBpbkJ1ZiA9IDA7CisgIHByb3RlY3RlZCBpbnQgdGFiU2l6ZSA9IDg7CisKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VGFiU2l6ZShpbnQgaSkgeyB0YWJTaXplID0gaTsgfQorICBwcm90ZWN0ZWQgaW50IGdldFRhYlNpemUoaW50IGkpIHsgcmV0dXJuIHRhYlNpemU7IH0KKworCisgIHByb3RlY3RlZCB2b2lkIEV4cGFuZEJ1ZmYoYm9vbGVhbiB3cmFwQXJvdW5kKQorICB7CisgICAgIGNoYXJbXSBuZXdidWZmZXIgPSBuZXcgY2hhcltidWZzaXplICsgMjA0OF07CisgICAgIGludCBuZXdidWZsaW5lW10gPSBuZXcgaW50W2J1ZnNpemUgKyAyMDQ4XTsKKyAgICAgaW50IG5ld2J1ZmNvbHVtbltdID0gbmV3IGludFtidWZzaXplICsgMjA0OF07CisKKyAgICAgdHJ5CisgICAgIHsKKyAgICAgICAgaWYgKHdyYXBBcm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgbmV3YnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7CisgICAgICAgICAgIGJ1ZmZlciA9IG5ld2J1ZmZlcjsKKworICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIHRva2VuQmVnaW4sIG5ld2J1ZmxpbmUsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCAwLCBuZXdidWZsaW5lLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKKyAgICAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7CisKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgMCwgbmV3YnVmY29sdW1uLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKKyAgICAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOworCisgICAgICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyArPSAoYnVmc2l6ZSAtIHRva2VuQmVnaW4pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOworICAgICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7CisKKyAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7CisgICAgICAgICAgIGJ1ZmxpbmUgPSBuZXdidWZsaW5lOworCisgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCB0b2tlbkJlZ2luLCBuZXdidWZjb2x1bW4sIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKKyAgICAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOworCisgICAgICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyAtPSB0b2tlbkJlZ2luKTsKKyAgICAgICAgfQorICAgICB9CisgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IodC5nZXRNZXNzYWdlKCkpOworICAgICB9CisKKworICAgICBidWZzaXplICs9IDIwNDg7CisgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemU7CisgICAgIHRva2VuQmVnaW4gPSAwOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgRmlsbEJ1ZmYoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICB7CisgICAgIGlmIChtYXhOZXh0Q2hhckluZCA9PSBhdmFpbGFibGUpCisgICAgIHsKKyAgICAgICAgaWYgKGF2YWlsYWJsZSA9PSBidWZzaXplKQorICAgICAgICB7CisgICAgICAgICAgIGlmICh0b2tlbkJlZ2luID4gMjA0OCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICBidWZwb3MgPSBtYXhOZXh0Q2hhckluZCA9IDA7CisgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IHRva2VuQmVnaW47CisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZSBpZiAodG9rZW5CZWdpbiA8IDApCisgICAgICAgICAgICAgIGJ1ZnBvcyA9IG1heE5leHRDaGFySW5kID0gMDsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBFeHBhbmRCdWZmKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhdmFpbGFibGUgPiB0b2tlbkJlZ2luKQorICAgICAgICAgICBhdmFpbGFibGUgPSBidWZzaXplOworICAgICAgICBlbHNlIGlmICgodG9rZW5CZWdpbiAtIGF2YWlsYWJsZSkgPCAyMDQ4KQorICAgICAgICAgICBFeHBhbmRCdWZmKHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgIGF2YWlsYWJsZSA9IHRva2VuQmVnaW47CisgICAgIH0KKworICAgICBpbnQgaTsKKyAgICAgdHJ5IHsKKyAgICAgICAgaWYgKChpID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIsIG1heE5leHRDaGFySW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIC0gbWF4TmV4dENoYXJJbmQpKSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgbWF4TmV4dENoYXJJbmQgKz0gaTsKKyAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAtLWJ1ZnBvczsKKyAgICAgICAgYmFja3VwKDApOworICAgICAgICBpZiAodG9rZW5CZWdpbiA9PSAtMSkKKyAgICAgICAgICAgdG9rZW5CZWdpbiA9IGJ1ZnBvczsKKyAgICAgICAgdGhyb3cgZTsKKyAgICAgfQorICB9CisKKyAgcHVibGljIGNoYXIgQmVnaW5Ub2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgIHsKKyAgICAgdG9rZW5CZWdpbiA9IC0xOworICAgICBjaGFyIGMgPSByZWFkQ2hhcigpOworICAgICB0b2tlbkJlZ2luID0gYnVmcG9zOworCisgICAgIHJldHVybiBjOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgVXBkYXRlTGluZUNvbHVtbihjaGFyIGMpCisgIHsKKyAgICAgY29sdW1uKys7CisKKyAgICAgaWYgKHByZXZDaGFySXNMRikKKyAgICAgeworICAgICAgICBwcmV2Q2hhcklzTEYgPSBmYWxzZTsKKyAgICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7CisgICAgIH0KKyAgICAgZWxzZSBpZiAocHJldkNoYXJJc0NSKQorICAgICB7CisgICAgICAgIHByZXZDaGFySXNDUiA9IGZhbHNlOworICAgICAgICBpZiAoYyA9PSAnXG4nKQorICAgICAgICB7CisgICAgICAgICAgIHByZXZDaGFySXNMRiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICBsaW5lICs9IChjb2x1bW4gPSAxKTsKKyAgICAgfQorCisgICAgIHN3aXRjaCAoYykKKyAgICAgeworICAgICAgICBjYXNlICdccicgOgorICAgICAgICAgICBwcmV2Q2hhcklzQ1IgPSB0cnVlOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXG4nIDoKKyAgICAgICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1x0JyA6CisgICAgICAgICAgIGNvbHVtbi0tOworICAgICAgICAgICBjb2x1bW4gKz0gKHRhYlNpemUgLSAoY29sdW1uICUgdGFiU2l6ZSkpOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgIGJyZWFrOworICAgICB9CisKKyAgICAgYnVmbGluZVtidWZwb3NdID0gbGluZTsKKyAgICAgYnVmY29sdW1uW2J1ZnBvc10gPSBjb2x1bW47CisgIH0KKworICBwdWJsaWMgY2hhciByZWFkQ2hhcigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgIHsKKyAgICAgaWYgKGluQnVmID4gMCkKKyAgICAgeworICAgICAgICAtLWluQnVmOworCisgICAgICAgIGlmICgrK2J1ZnBvcyA9PSBidWZzaXplKQorICAgICAgICAgICBidWZwb3MgPSAwOworCisgICAgICAgIHJldHVybiBidWZmZXJbYnVmcG9zXTsKKyAgICAgfQorCisgICAgIGlmICgrK2J1ZnBvcyA+PSBtYXhOZXh0Q2hhckluZCkKKyAgICAgICAgRmlsbEJ1ZmYoKTsKKworICAgICBjaGFyIGMgPSBidWZmZXJbYnVmcG9zXTsKKworICAgICBVcGRhdGVMaW5lQ29sdW1uKGMpOworICAgICByZXR1cm4gKGMpOworICB9CisKKyAgLyoqCisgICAqIEBkZXByZWNhdGVkIAorICAgKiBAc2VlICNnZXRFbmRDb2x1bW4KKyAgICovCisKKyAgcHVibGljIGludCBnZXRDb2x1bW4oKSB7CisgICAgIHJldHVybiBidWZjb2x1bW5bYnVmcG9zXTsKKyAgfQorCisgIC8qKgorICAgKiBAZGVwcmVjYXRlZCAKKyAgICogQHNlZSAjZ2V0RW5kTGluZQorICAgKi8KKworICBwdWJsaWMgaW50IGdldExpbmUoKSB7CisgICAgIHJldHVybiBidWZsaW5lW2J1ZnBvc107CisgIH0KKworICBwdWJsaWMgaW50IGdldEVuZENvbHVtbigpIHsKKyAgICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOworICB9CisKKyAgcHVibGljIGludCBnZXRFbmRMaW5lKCkgeworICAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOworICB9CisKKyAgcHVibGljIGludCBnZXRCZWdpbkNvbHVtbigpIHsKKyAgICAgcmV0dXJuIGJ1ZmNvbHVtblt0b2tlbkJlZ2luXTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0QmVnaW5MaW5lKCkgeworICAgICByZXR1cm4gYnVmbGluZVt0b2tlbkJlZ2luXTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGJhY2t1cChpbnQgYW1vdW50KSB7CisKKyAgICBpbkJ1ZiArPSBhbW91bnQ7CisgICAgaWYgKChidWZwb3MgLT0gYW1vdW50KSA8IDApCisgICAgICAgYnVmcG9zICs9IGJ1ZnNpemU7CisgIH0KKworICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQorICB7CisgICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOworICAgIGxpbmUgPSBzdGFydGxpbmU7CisgICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOworCisgICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7CisgICAgYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyc2l6ZV07CisgICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07CisgICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKKyAgfQorCisgIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKKyAgeworICAgICB0aGlzKGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOworICB9CisKKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKKyAgeworICAgICB0aGlzKGRzdHJlYW0sIDEsIDEsIDQwOTYpOworICB9CisgIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQorICB7CisgICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOworICAgIGxpbmUgPSBzdGFydGxpbmU7CisgICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOworCisgICAgaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGJ1ZmZlcnNpemUgIT0gYnVmZmVyLmxlbmd0aCkKKyAgICB7CisgICAgICBhdmFpbGFibGUgPSBidWZzaXplID0gYnVmZmVyc2l6ZTsKKyAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOworICAgICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07CisgICAgICBidWZjb2x1bW4gPSBuZXcgaW50W2J1ZmZlcnNpemVdOworICAgIH0KKyAgICBwcmV2Q2hhcklzTEYgPSBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKKyAgICB0b2tlbkJlZ2luID0gaW5CdWYgPSBtYXhOZXh0Q2hhckluZCA9IDA7CisgICAgYnVmcG9zID0gLTE7CisgIH0KKworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKKyAgeworICAgICBSZUluaXQoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7CisgIH0KKworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKKyAgeworICAgICBSZUluaXQoZHN0cmVhbSwgMSwgMSwgNDA5Nik7CisgIH0KKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcsIGludCBzdGFydGxpbmUsCisgIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgeworICAgICB0aGlzKGVuY29kaW5nID09IG51bGwgPyBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSA6IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0sIGVuY29kaW5nKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgYnVmZmVyc2l6ZSk7CisgIH0KKworICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCisgIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCisgIHsKKyAgICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgYnVmZmVyc2l6ZSk7CisgIH0KKworICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZywgaW50IHN0YXJ0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICAgdGhpcyhkc3RyZWFtLCBlbmNvZGluZywgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7CisgIH0KKworICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKKyAgeworICAgICB0aGlzKGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOworICB9CisKKyAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgeworICAgICB0aGlzKGRzdHJlYW0sIGVuY29kaW5nLCAxLCAxLCA0MDk2KTsKKyAgfQorCisgIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSkKKyAgeworICAgICB0aGlzKGRzdHJlYW0sIDEsIDEsIDQwOTYpOworICB9CisKKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLCBpbnQgc3RhcnRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICAgUmVJbml0KGVuY29kaW5nID09IG51bGwgPyBuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSA6IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0sIGVuY29kaW5nKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgYnVmZmVyc2l6ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQorICB7CisgICAgIFJlSW5pdChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgYnVmZmVyc2l6ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgeworICAgICBSZUluaXQoZHN0cmVhbSwgZW5jb2RpbmcsIDEsIDEsIDQwOTYpOworICB9CisKKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSkKKyAgeworICAgICBSZUluaXQoZHN0cmVhbSwgMSwgMSwgNDA5Nik7CisgIH0KKyAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLCBpbnQgc3RhcnRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisgIHsKKyAgICAgUmVJbml0KGRzdHJlYW0sIGVuY29kaW5nLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKKyAgfQorICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQorICB7CisgICAgIFJlSW5pdChkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKKyAgfQorICBwdWJsaWMgU3RyaW5nIEdldEltYWdlKCkKKyAgeworICAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgdG9rZW5CZWdpbiwgYnVmcG9zIC0gdG9rZW5CZWdpbiArIDEpOworICAgICBlbHNlCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgdG9rZW5CZWdpbiwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBidWZwb3MgKyAxKTsKKyAgfQorCisgIHB1YmxpYyBjaGFyW10gR2V0U3VmZml4KGludCBsZW4pCisgIHsKKyAgICAgY2hhcltdIHJldCA9IG5ldyBjaGFyW2xlbl07CisKKyAgICAgaWYgKChidWZwb3MgKyAxKSA+PSBsZW4pCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZwb3MgLSBsZW4gKyAxLCByZXQsIDAsIGxlbik7CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmc2l6ZSAtIChsZW4gLSBidWZwb3MgLSAxKSwgcmV0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIGJ1ZnBvcyAtIDEpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgcmV0LCBsZW4gLSBidWZwb3MgLSAxLCBidWZwb3MgKyAxKTsKKyAgICAgfQorCisgICAgIHJldHVybiByZXQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBEb25lKCkKKyAgeworICAgICBidWZmZXIgPSBudWxsOworICAgICBidWZsaW5lID0gbnVsbDsKKyAgICAgYnVmY29sdW1uID0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBNZXRob2QgdG8gYWRqdXN0IGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGZvciB0aGUgc3RhcnQgb2YgYSB0b2tlbi4KKyAgICovCisgIHB1YmxpYyB2b2lkIGFkanVzdEJlZ2luTGluZUNvbHVtbihpbnQgbmV3TGluZSwgaW50IG5ld0NvbCkKKyAgeworICAgICBpbnQgc3RhcnQgPSB0b2tlbkJlZ2luOworICAgICBpbnQgbGVuOworCisgICAgIGlmIChidWZwb3MgPj0gdG9rZW5CZWdpbikKKyAgICAgeworICAgICAgICBsZW4gPSBidWZwb3MgLSB0b2tlbkJlZ2luICsgaW5CdWYgKyAxOworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICBsZW4gPSBidWZzaXplIC0gdG9rZW5CZWdpbiArIGJ1ZnBvcyArIDEgKyBpbkJ1ZjsKKyAgICAgfQorCisgICAgIGludCBpID0gMCwgaiA9IDAsIGsgPSAwOworICAgICBpbnQgbmV4dENvbERpZmYgPSAwLCBjb2x1bW5EaWZmID0gMDsKKworICAgICB3aGlsZSAoaSA8IGxlbiAmJgorICAgICAgICAgICAgYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSA9PSBidWZsaW5lW2sgPSArK3N0YXJ0ICUgYnVmc2l6ZV0pCisgICAgIHsKKyAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7CisgICAgICAgIG5leHRDb2xEaWZmID0gY29sdW1uRGlmZiArIGJ1ZmNvbHVtbltrXSAtIGJ1ZmNvbHVtbltqXTsKKyAgICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKKyAgICAgICAgY29sdW1uRGlmZiA9IG5leHRDb2xEaWZmOworICAgICAgICBpKys7CisgICAgIH0gCisKKyAgICAgaWYgKGkgPCBsZW4pCisgICAgIHsKKyAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmUrKzsKKyAgICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKKworICAgICAgICB3aGlsZSAoaSsrIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgIGlmIChidWZsaW5lW2ogPSBzdGFydCAlIGJ1ZnNpemVdICE9IGJ1ZmxpbmVbKytzdGFydCAlIGJ1ZnNpemVdKQorICAgICAgICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOworICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOworICAgICAgICB9CisgICAgIH0KKworICAgICBsaW5lID0gYnVmbGluZVtqXTsKKyAgICAgY29sdW1uID0gYnVmY29sdW1uW2pdOworICB9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9wYXJzZXIvVG9rZW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9wYXJzZXIvVG9rZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWIyMzUxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL3BhcnNlci9Ub2tlbi5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gVG9rZW4uamF2YSBWZXJzaW9uIDMuMCAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLnBhcnNlcjsKKworLyoqCisgKiBEZXNjcmliZXMgdGhlIGlucHV0IHRva2VuIHN0cmVhbS4KKyAqLworCitwdWJsaWMgY2xhc3MgVG9rZW4geworCisgIC8qKgorICAgKiBBbiBpbnRlZ2VyIHRoYXQgZGVzY3JpYmVzIHRoZSBraW5kIG9mIHRoaXMgdG9rZW4uICBUaGlzIG51bWJlcmluZworICAgKiBzeXN0ZW0gaXMgZGV0ZXJtaW5lZCBieSBKYXZhQ0NQYXJzZXIsIGFuZCBhIHRhYmxlIG9mIHRoZXNlIG51bWJlcnMgaXMKKyAgICogc3RvcmVkIGluIHRoZSBmaWxlIC4uLkNvbnN0YW50cy5qYXZhLgorICAgKi8KKyAgcHVibGljIGludCBraW5kOworCisgIC8qKgorICAgKiBiZWdpbkxpbmUgYW5kIGJlZ2luQ29sdW1uIGRlc2NyaWJlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICAqIG9mIHRoaXMgdG9rZW47IGVuZExpbmUgYW5kIGVuZENvbHVtbiBkZXNjcmliZSB0aGUgcG9zaXRpb24gb2YgdGhlCisgICAqIGxhc3QgY2hhcmFjdGVyIG9mIHRoaXMgdG9rZW4uCisgICAqLworICBwdWJsaWMgaW50IGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbjsKKworICAvKioKKyAgICogVGhlIHN0cmluZyBpbWFnZSBvZiB0aGUgdG9rZW4uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGltYWdlOworCisgIC8qKgorICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbmV4dCByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4gZnJvbSB0aGUgaW5wdXQKKyAgICogc3RyZWFtLiAgSWYgdGhpcyBpcyB0aGUgbGFzdCB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIG9yIGlmIHRoZQorICAgKiB0b2tlbiBtYW5hZ2VyIGhhcyBub3QgcmVhZCB0b2tlbnMgYmV5b25kIHRoaXMgb25lLCB0aGlzIGZpZWxkIGlzCisgICAqIHNldCB0byBudWxsLiAgVGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhpcyB0b2tlbiBpcyBhbHNvIGEgcmVndWxhcgorICAgKiB0b2tlbi4gIE90aGVyd2lzZSwgc2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZgorICAgKiB0aGlzIGZpZWxkLgorICAgKi8KKyAgcHVibGljIFRva2VuIG5leHQ7CisKKyAgLyoqCisgICAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBhY2Nlc3Mgc3BlY2lhbCB0b2tlbnMgdGhhdCBvY2N1ciBwcmlvciB0byB0aGlzCisgICAqIHRva2VuLCBidXQgYWZ0ZXIgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4uCisgICAqIElmIHRoZXJlIGFyZSBubyBzdWNoIHNwZWNpYWwgdG9rZW5zLCB0aGlzIGZpZWxkIGlzIHNldCB0byBudWxsLgorICAgKiBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHN1Y2ggc3BlY2lhbCB0b2tlbiwgdGhpcyBmaWVsZCByZWZlcnMKKyAgICogdG8gdGhlIGxhc3Qgb2YgdGhlc2Ugc3BlY2lhbCB0b2tlbnMsIHdoaWNoIGluIHR1cm4gcmVmZXJzIHRvIHRoZSBuZXh0CisgICAqIHByZXZpb3VzIHNwZWNpYWwgdG9rZW4gdGhyb3VnaCBpdHMgc3BlY2lhbFRva2VuIGZpZWxkLCBhbmQgc28gb24KKyAgICogdW50aWwgdGhlIGZpcnN0IHNwZWNpYWwgdG9rZW4gKHdob3NlIHNwZWNpYWxUb2tlbiBmaWVsZCBpcyBudWxsKS4KKyAgICogVGhlIG5leHQgZmllbGRzIG9mIHNwZWNpYWwgdG9rZW5zIHJlZmVyIHRvIG90aGVyIHNwZWNpYWwgdG9rZW5zIHRoYXQKKyAgICogaW1tZWRpYXRlbHkgZm9sbG93IGl0ICh3aXRob3V0IGFuIGludGVydmVuaW5nIHJlZ3VsYXIgdG9rZW4pLiAgSWYgdGhlcmUKKyAgICogaXMgbm8gc3VjaCB0b2tlbiwgdGhpcyBmaWVsZCBpcyBudWxsLgorICAgKi8KKyAgcHVibGljIFRva2VuIHNwZWNpYWxUb2tlbjsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgaW1hZ2UuCisgICAqLworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgeworICAgICByZXR1cm4gaW1hZ2U7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhIG5ldyBUb2tlbiBvYmplY3QsIGJ5IGRlZmF1bHQuIEhvd2V2ZXIsIGlmIHlvdSB3YW50LCB5b3UKKyAgICogY2FuIGNyZWF0ZSBhbmQgcmV0dXJuIHN1YmNsYXNzIG9iamVjdHMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG9mS2luZC4KKyAgICogU2ltcGx5IGFkZCB0aGUgY2FzZXMgdG8gdGhlIHN3aXRjaCBmb3IgYWxsIHRob3NlIHNwZWNpYWwgY2FzZXMuCisgICAqIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHN1YmNsYXNzIG9mIFRva2VuIGNhbGxlZCBJRFRva2VuIHRoYXQKKyAgICogeW91IHdhbnQgdG8gY3JlYXRlIGlmIG9mS2luZCBpcyBJRCwgc2ltbHB5IGFkZCBzb21ldGhpbmcgbGlrZSA6CisgICAqCisgICAqICAgIGNhc2UgTXlQYXJzZXJDb25zdGFudHMuSUQgOiByZXR1cm4gbmV3IElEVG9rZW4oKTsKKyAgICoKKyAgICogdG8gdGhlIGZvbGxvd2luZyBzd2l0Y2ggc3RhdGVtZW50LiBUaGVuIHlvdSBjYW4gY2FzdCBtYXRjaGVkVG9rZW4KKyAgICogdmFyaWFibGUgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUgYW5kIHVzZSBpdCBpbiB5b3VyIGxleGljYWwgYWN0aW9ucy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW4gbmV3VG9rZW4oaW50IG9mS2luZCkKKyAgeworICAgICBzd2l0Y2gob2ZLaW5kKQorICAgICB7CisgICAgICAgZGVmYXVsdCA6IHJldHVybiBuZXcgVG9rZW4oKTsKKyAgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9wYXJzZXIvVG9rZW5NZ3JFcnJvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL2xhbmcvZ2VuL3BhcnNlci9Ub2tlbk1nckVycm9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0MWQzYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS9sYW5nL2dlbi9wYXJzZXIvVG9rZW5NZ3JFcnJvci5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFRva2VuTWdyRXJyb3IuamF2YSBWZXJzaW9uIDMuMCAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLnBhcnNlcjsKKworcHVibGljIGNsYXNzIFRva2VuTWdyRXJyb3IgZXh0ZW5kcyBFcnJvcgoreworICAgLyoKKyAgICAqIE9yZGluYWxzIGZvciB2YXJpb3VzIHJlYXNvbnMgd2h5IGFuIEVycm9yIG9mIHRoaXMgdHlwZSBjYW4gYmUgdGhyb3duLgorICAgICovCisKKyAgIC8qKgorICAgICogTGV4aWNhbCBlcnJvciBvY2N1cmVkLgorICAgICovCisgICBzdGF0aWMgZmluYWwgaW50IExFWElDQUxfRVJST1IgPSAwOworCisgICAvKioKKyAgICAqIEFuIGF0dGVtcHQgd2FzcyBtYWRlIHRvIGNyZWF0ZSBhIHNlY29uZCBpbnN0YW5jZSBvZiBhIHN0YXRpYyB0b2tlbiBtYW5hZ2VyLgorICAgICovCisgICBzdGF0aWMgZmluYWwgaW50IFNUQVRJQ19MRVhFUl9FUlJPUiA9IDE7CisKKyAgIC8qKgorICAgICogVHJpZWQgdG8gY2hhbmdlIHRvIGFuIGludmFsaWQgbGV4aWNhbCBzdGF0ZS4KKyAgICAqLworICAgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0xFWElDQUxfU1RBVEUgPSAyOworCisgICAvKioKKyAgICAqIERldGVjdGVkIChhbmQgYmFpbGVkIG91dCBvZikgYW4gaW5maW5pdGUgbG9vcCBpbiB0aGUgdG9rZW4gbWFuYWdlci4KKyAgICAqLworICAgc3RhdGljIGZpbmFsIGludCBMT09QX0RFVEVDVEVEID0gMzsKKworICAgLyoqCisgICAgKiBJbmRpY2F0ZXMgdGhlIHJlYXNvbiB3aHkgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uIEl0IHdpbGwgaGF2ZQorICAgICogb25lIG9mIHRoZSBhYm92ZSA0IHZhbHVlcy4KKyAgICAqLworICAgaW50IGVycm9yQ29kZTsKKworICAgLyoqCisgICAgKiBSZXBsYWNlcyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGJ5IHRoZWlyIGVzcGFjZWQgKG9yIHVuaWNvZGUgZXNjYXBlZCkKKyAgICAqIGVxdWl2YWxlbnRzIGluIHRoZSBnaXZlbiBzdHJpbmcKKyAgICAqLworICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWRkRXNjYXBlcyhTdHJpbmcgc3RyKSB7CisgICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgY2hhciBjaDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQorICAgICAgICB7CisgICAgICAgICAgIGNhc2UgMCA6CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcYic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmICgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjAgfHwgY2ggPiAweDdlKSB7CisgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOworICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKKyAgIH0KKworICAgLyoqCisgICAgKiBSZXR1cm5zIGEgZGV0YWlsZWQgbWVzc2FnZSBmb3IgdGhlIEVycm9yIHdoZW4gaXQgaXMgdGhyb3duIGJ5IHRoZQorICAgICogdG9rZW4gbWFuYWdlciB0byBpbmRpY2F0ZSBhIGxleGljYWwgZXJyb3IuCisgICAgKiBQYXJhbWV0ZXJzIDogCisgICAgKiAgICBFT0ZTZWVuICAgICA6IGluZGljYXRlcyBpZiBFT0YgY2F1c2VkIHRoZSBsZXhpY2wgZXJyb3IKKyAgICAqICAgIGN1ckxleFN0YXRlIDogbGV4aWNhbCBzdGF0ZSBpbiB3aGljaCB0aGlzIGVycm9yIG9jY3VyZWQKKyAgICAqICAgIGVycm9yTGluZSAgIDogbGluZSBudW1iZXIgd2hlbiB0aGUgZXJyb3Igb2NjdXJlZAorICAgICogICAgZXJyb3JDb2x1bW4gOiBjb2x1bW4gbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VyZWQKKyAgICAqICAgIGVycm9yQWZ0ZXIgIDogcHJlZml4IHRoYXQgd2FzIHNlZW4gYmVmb3JlIHRoaXMgZXJyb3Igb2NjdXJlZAorICAgICogICAgY3VyY2hhciAgICAgOiB0aGUgb2ZmZW5kaW5nIGNoYXJhY3RlcgorICAgICogTm90ZTogWW91IGNhbiBjdXN0b21pemUgdGhlIGxleGljYWwgZXJyb3IgbWVzc2FnZSBieSBtb2RpZnlpbmcgdGhpcyBtZXRob2QuCisgICAgKi8KKyAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIExleGljYWxFcnJvcihib29sZWFuIEVPRlNlZW4sIGludCBsZXhTdGF0ZSwgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLCBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyKSB7CisgICAgICByZXR1cm4oIkxleGljYWwgZXJyb3IgYXQgbGluZSAiICsKKyAgICAgICAgICAgZXJyb3JMaW5lICsgIiwgY29sdW1uICIgKworICAgICAgICAgICBlcnJvckNvbHVtbiArICIuICBFbmNvdW50ZXJlZDogIiArCisgICAgICAgICAgIChFT0ZTZWVuID8gIjxFT0Y+ICIgOiAoIlwiIiArIGFkZEVzY2FwZXMoU3RyaW5nLnZhbHVlT2YoY3VyQ2hhcikpICsgIlwiIikgKyAiICgiICsgKGludCljdXJDaGFyICsgIiksICIpICsKKyAgICAgICAgICAgImFmdGVyIDogXCIiICsgYWRkRXNjYXBlcyhlcnJvckFmdGVyKSArICJcIiIpOworICAgfQorCisgICAvKioKKyAgICAqIFlvdSBjYW4gYWxzbyBtb2RpZnkgdGhlIGJvZHkgb2YgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgbWVzc2FnZXMuCisgICAgKiBGb3IgZXhhbXBsZSwgY2FzZXMgbGlrZSBMT09QX0RFVEVDVEVEIGFuZCBJTlZBTElEX0xFWElDQUxfU1RBVEUgYXJlIG5vdAorICAgICogb2YgZW5kLXVzZXJzIGNvbmNlcm4sIHNvIHlvdSBjYW4gcmV0dXJuIHNvbWV0aGluZyBsaWtlIDogCisgICAgKgorICAgICogICAgICJJbnRlcm5hbCBFcnJvciA6IFBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCAuLi4uICIKKyAgICAqCisgICAgKiBmcm9tIHRoaXMgbWV0aG9kIGZvciBzdWNoIGNhc2VzIGluIHRoZSByZWxlYXNlIHZlcnNpb24gb2YgeW91ciBwYXJzZXIuCisgICAgKi8KKyAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7CisgICB9CisKKyAgIC8qCisgICAgKiBDb25zdHJ1Y3RvcnMgb2YgdmFyaW91cyBmbGF2b3JzIGZvbGxvdy4KKyAgICAqLworCisgICBwdWJsaWMgVG9rZW5NZ3JFcnJvcigpIHsKKyAgIH0KKworICAgcHVibGljIFRva2VuTWdyRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCByZWFzb24pIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgZXJyb3JDb2RlID0gcmVhc29uOworICAgfQorCisgICBwdWJsaWMgVG9rZW5NZ3JFcnJvcihib29sZWFuIEVPRlNlZW4sIGludCBsZXhTdGF0ZSwgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLCBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyLCBpbnQgcmVhc29uKSB7CisgICAgICB0aGlzKExleGljYWxFcnJvcihFT0ZTZWVuLCBsZXhTdGF0ZSwgZXJyb3JMaW5lLCBlcnJvckNvbHVtbiwgZXJyb3JBZnRlciwgY3VyQ2hhciksIHJlYXNvbik7CisgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvdXRpbC9FbWZhdGljQW5ub3RhdGlvbk1hcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL3V0aWwvRW1mYXRpY0Fubm90YXRpb25NYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmFlYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL3V0aWwvRW1mYXRpY0Fubm90YXRpb25NYXAuamF2YQpAQCAtMCwwICsxLDI1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkV4dGVuZGVkTWV0YURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmF0b3IuZWNvcmUuRW1mYXRpY1NlbWFudGljV2FybmluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lY29yZS5HZW5lcmF0aW9uUGhhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuS2V5RXF1YWxzVmFsdWU7CisKKworLyoqCisgKiAKKyAqIEBhdXRob3IgY2pkYWx5QHVzLmlibS5jb20KKyAqLworcHVibGljIGNsYXNzIEVtZmF0aWNBbm5vdGF0aW9uTWFwIHsKKyAgICAKKyAgICAvLworICAgIC8vIHZhbHVlcyBmb3Igc3BlY2lhbCBAbmFtZXNwYWNlIGZhdXggYW5ub3RhdGlvbgorICAgIC8vCisgICAgCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBBQ0tBR0VfTkFNRVNQQUNFX0FOTk9UQVRJT04gPSAibmFtZXNwYWNlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUEFDS0FHRV9OU1BSRUZJWF9LRVkgPSAicHJlZml4IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUEFDS0FHRV9OU1VSSV9LRVkgPSAidXJpIjsKKyAgICAKKyAgICAvLworICAgIC8vCisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1GQVRJQ19BTk5PVEFUSU9OX01BUF9MQUJFTCA9ICJFbWZhdGljQW5ub3RhdGlvbk1hcCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1GQVRJQ19BTk5PVEFUSU9OX01BUF9OU19VUkkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwNC8iICsgRU1GQVRJQ19BTk5PVEFUSU9OX01BUF9MQUJFTDsKKwkKKwkKKwkvLyBUT0RPOiBjb3BpZWQgZnJvbSBFY29yZVV0aWwgcHJvdGVjdGVkIG1lbWJlci4gIElzIHRoaXMgaW4gYSBwdWJsaWMgcGxhY2U/CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTl9NT0RFTF9QQUNLQUdFX0xBQkVMID0gIkdlbk1vZGVsIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VOX01PREVMX1BBQ0tBR0VfTlNfVVJJID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVDT1JFX1BBQ0tBR0VfTEFCRUwgPSAiRWNvcmUiOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRFRF9NRVRBX0RBVEFfTEFCRUwgPSAiRXh0ZW5kZWRNZXRhRGF0YSI7CisJCisJLy8KKwkvLworCS8vCisJCisgICAgcHJpdmF0ZSBIYXNodGFibGUgX2tleVRvU291cmNlVVJJOworICAgIHByaXZhdGUgSGFzaHRhYmxlIF9zb3VyY2VVUklUb0RldGFpbHM7CisgICAgCisgICAgcHVibGljIEVtZmF0aWNBbm5vdGF0aW9uTWFwKCkgeworICAgICAgICBfa2V5VG9Tb3VyY2VVUkkgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIF9zb3VyY2VVUklUb0RldGFpbHMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIAorICAgICAgICBpbml0UHJlZGVmaW5lZE1hcHBpbmdzKCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBpbml0UHJlZGVmaW5lZE1hcHBpbmdzKCkgeworICAgICAgICBhZGRNYXBwaW5nKEdFTl9NT0RFTF9QQUNLQUdFX0xBQkVMLCBHRU5fTU9ERUxfUEFDS0FHRV9OU19VUkkpOworICAgICAgICBhZGRNYXBwaW5nKEVDT1JFX1BBQ0tBR0VfTEFCRUwsIEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKKyAgICAgICAgYWRkTWFwcGluZyhFWFRFTkRFRF9NRVRBX0RBVEFfTEFCRUwsIEV4dGVuZGVkTWV0YURhdGEuQU5OT1RBVElPTl9VUkkpOworICAgICAgICBhZGRNYXBwaW5nKEVNRkFUSUNfQU5OT1RBVElPTl9NQVBfTEFCRUwsIEVNRkFUSUNfQU5OT1RBVElPTl9NQVBfTlNfVVJJKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBhZGRNYXBwaW5nKFN0cmluZyBsYWJlbERlY2wsIFN0cmluZyBzb3VyY2VVUkkpIHsKKyAgICAgICAgcmV0dXJuIGFkZE1hcHBpbmcobGFiZWxEZWNsLCBzb3VyY2VVUkksIG51bGwsIG51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGFkZE1hcHBpbmcoU3RyaW5nIGxhYmVsRGVjbCwgU3RyaW5nIHNvdXJjZVVSSSwgS2V5RXF1YWxzVmFsdWUga2V5RXF1YWxzVmFsdWUsIEdlbmVyYXRpb25QaGFzZSByZXBvcnRlcikgeworICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFkZE1hcHBpbmc6ICIgKyBsYWJlbERlY2wgKyAiLCAiICsgc291cmNlVVJJKTsKKyAgICAgICAgCisgICAgICAgIExhYmVsTWFwcGluZyBsYWJlbE1hcHBpbmcgPSBuZXcgTGFiZWxNYXBwaW5nKGxhYmVsRGVjbCk7CisgICAgICAgIGlmICghbGFiZWxNYXBwaW5nLmlzV2VsbEZvcm1lZCgpKSB7CisgICAgICAgICAgICByZXBvcnRBZGRNYXBwaW5nUHJvYmxlbSgibGFiZWwgbm90IHdlbGwgZm9ybWVkISIsIGtleUVxdWFsc1ZhbHVlLCByZXBvcnRlcik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbGFiZWwgPSBsYWJlbE1hcHBpbmcuZ2V0TGFiZWwoKTsKKyAgICAgICAgU3RyaW5nIGtleSA9IGxhYmVsTWFwcGluZy5nZXRLZXkoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChzb3VyY2VVUkkgPT0gbnVsbCkgc291cmNlVVJJID0gbGFiZWw7CisgICAgICAgIAorICAgICAgICBib29sZWFuIG5ld1NvdXJjZVVSSSA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgU291cmNlVVJJRGV0YWlscyBkZXRhaWxzID0gKFNvdXJjZVVSSURldGFpbHMpX3NvdXJjZVVSSVRvRGV0YWlscy5nZXQoc291cmNlVVJJKTsKKyAgICAgICAgaWYgKGRldGFpbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgZGV0YWlscyA9IG5ldyBTb3VyY2VVUklEZXRhaWxzKHNvdXJjZVVSSSk7CisgICAgICAgICAgICBuZXdTb3VyY2VVUkkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRldGFpbHMuaGFzTWFwcGluZyhsYWJlbE1hcHBpbmcuZ2V0SW1wbGljaXRLZXlDb3VudCgpKSkgeworICAgICAgICAgICAgU3RyaW5nIG0yID0gZGV0YWlscy5nZXRNYXBwaW5nKGxhYmVsTWFwcGluZy5nZXRJbXBsaWNpdEtleUNvdW50KCkpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXBvcnRBZGRNYXBwaW5nUHJvYmxlbSgibWFwcGluZyBhbHJlYWR5IGV4aXN0czogIiArIG0yLCBrZXlFcXVhbHNWYWx1ZSwgcmVwb3J0ZXIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU3RyaW5nIHNvdXJjZVVSSUNoZWNrID0gKFN0cmluZylfa2V5VG9Tb3VyY2VVUkkuZ2V0KGtleSk7CisgICAgICAgIGlmIChzb3VyY2VVUklDaGVjayA9PSBudWxsKSB7CisgICAgICAgICAgICBfa2V5VG9Tb3VyY2VVUkkucHV0KGtleSwgc291cmNlVVJJKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc291cmNlVVJJQ2hlY2suZXF1YWxzKHNvdXJjZVVSSSkpIHsKKyAgICAgICAgICAgIHJlcG9ydEFkZE1hcHBpbmdQcm9ibGVtKCJsYWJlbCBhcmVhZHkgaW4gdXNlIGZvciBzb3VyY2VVUkk6ICIgKyBzb3VyY2VVUklDaGVjaywga2V5RXF1YWxzVmFsdWUsIHJlcG9ydGVyKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobmV3U291cmNlVVJJKSB7CisgICAgICAgICAgICBfc291cmNlVVJJVG9EZXRhaWxzLnB1dChzb3VyY2VVUkksIGRldGFpbHMpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkZXRhaWxzLmFkZE1hcHBpbmcobGFiZWxNYXBwaW5nKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBsYWJlbDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHJlcG9ydEFkZE1hcHBpbmdQcm9ibGVtKFN0cmluZyBtZXNzYWdlLCBLZXlFcXVhbHNWYWx1ZSBrZXlFcXVhbHNWYWx1ZSwgR2VuZXJhdGlvblBoYXNlIHJlcG9ydGVyKSB7CisgICAgICAgIGlmICgoa2V5RXF1YWxzVmFsdWUgIT0gbnVsbCkgJiYgKHJlcG9ydGVyICE9IG51bGwpKSB7CisgICAgICAgICAgICByZXBvcnRlci5sb2dXYXJuaW5nKG5ldyBFbWZhdGljU2VtYW50aWNXYXJuaW5nLkFubm90YXRpb25NYXBwaW5nUHJvYmxlbShrZXlFcXVhbHNWYWx1ZSwgbWVzc2FnZSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxGb3JTb3VyY2VVUkkoU3RyaW5nIHNvdXJjZVVSSSwgaW50IHBhcmFtQ291bnQpIHsKKyAgICAgICAgU291cmNlVVJJRGV0YWlscyBkZXRhaWxzID0gKFNvdXJjZVVSSURldGFpbHMpX3NvdXJjZVVSSVRvRGV0YWlscy5nZXQoc291cmNlVVJJKTsKKyAgICAgICAgaWYgKGRldGFpbHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgTGFiZWxNYXBwaW5nIGxhYmVsTWFwcGluZyA9IGRldGFpbHMuZ2V0TWFwcGluZyhwYXJhbUNvdW50KTsKKyAgICAgICAgaWYgKGxhYmVsTWFwcGluZyAhPSBudWxsKSByZXR1cm4gbGFiZWxNYXBwaW5nLmdldExhYmVsKCk7CisgICAgICAgIAorICAgICAgICAvLyBTZWUgaWYgdGhlcmUncyBhICJkZWZhdWx0IiBsYWJlbAorICAgICAgICBsYWJlbE1hcHBpbmcgPSBkZXRhaWxzLmdldE1hcHBpbmcoMCk7CisgICAgICAgIGlmIChsYWJlbE1hcHBpbmcgIT0gbnVsbCkgcmV0dXJuIGxhYmVsTWFwcGluZy5nZXRMYWJlbCgpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgbWFwU291cmNlVVJJKFN0cmluZyBsaXRlcmFsU291cmNlVXJpVGV4dCkgeworICAgICAgICByZXR1cm4gKFN0cmluZylfa2V5VG9Tb3VyY2VVUkkuZ2V0KGxpdGVyYWxTb3VyY2VVcmlUZXh0LnRvTG93ZXJDYXNlKCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldEltcGxpY2l0S2V5TmFtZShTdHJpbmcgc291cmNlVVJJLCBpbnQgcGFyYW1JbmRleCwgaW50IHRvdGFsUGFyYW1Db3VudCkgeworICAgICAgICBTb3VyY2VVUklEZXRhaWxzIGRldGFpbHMgPSAoU291cmNlVVJJRGV0YWlscylfc291cmNlVVJJVG9EZXRhaWxzLmdldChzb3VyY2VVUkkpOworICAgICAgICBpZiAoZGV0YWlscyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgTGFiZWxNYXBwaW5nIGxhYmVsTWFwcGluZyA9IGRldGFpbHMuZ2V0TWFwcGluZyh0b3RhbFBhcmFtQ291bnQpOworICAgICAgICBpZiAobGFiZWxNYXBwaW5nID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gbGFiZWxNYXBwaW5nLmdldEltcGxpY2l0S2V5KHBhcmFtSW5kZXgpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTb3VyY2VVUklEZXRhaWxzIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX3NvdXJjZVVSSTsKKyAgICAgICAgcHJpdmF0ZSBIYXNodGFibGUgX2tleUNvdW50VG9MYWJlbE1hcHBpbmc7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU291cmNlVVJJRGV0YWlscyhTdHJpbmcgc291cmNlVVJJKSB7CisgICAgICAgICAgICBfc291cmNlVVJJID0gc291cmNlVVJJOworICAgICAgICAgICAgX2tleUNvdW50VG9MYWJlbE1hcHBpbmcgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlVVJJKCkgeworICAgICAgICAgICAgcmV0dXJuIF9zb3VyY2VVUkk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBMYWJlbE1hcHBpbmcgYWRkTWFwcGluZyhMYWJlbE1hcHBpbmcgbWFwcGluZykgeworICAgICAgICAgICAgSW50ZWdlciBrZXlDb3VudCA9IG5ldyBJbnRlZ2VyKG1hcHBpbmcuZ2V0SW1wbGljaXRLZXlDb3VudCgpKTsKKyAgICAgICAgICAgIF9rZXlDb3VudFRvTGFiZWxNYXBwaW5nLnB1dChrZXlDb3VudCwgbWFwcGluZyk7CisgICAgICAgICAgICByZXR1cm4gbWFwcGluZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIExhYmVsTWFwcGluZyBnZXRNYXBwaW5nKGludCBrZXlDb3VudCkgeworICAgICAgICAgICAgSW50ZWdlciBrZXlDb3VudEludCA9IG5ldyBJbnRlZ2VyKGtleUNvdW50KTsKKyAgICAgICAgICAgIExhYmVsTWFwcGluZyBtYXBwaW5nID0gKExhYmVsTWFwcGluZylfa2V5Q291bnRUb0xhYmVsTWFwcGluZy5nZXQoa2V5Q291bnRJbnQpOworICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01hcHBpbmcoU3RyaW5nIGxhYmVsLCBpbnQga2V5Q291bnQpIHsKKyAgICAgICAgICAgIExhYmVsTWFwcGluZyBtYXBwaW5nID0gZ2V0TWFwcGluZyhrZXlDb3VudCk7CisgICAgICAgICAgICBpZiAobWFwcGluZyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gbWFwcGluZy5nZXRLZXkoKS5lcXVhbHMobGFiZWwudG9Mb3dlckNhc2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01hcHBpbmcoaW50IGtleUNvdW50KSB7CisgICAgICAgICAgICBMYWJlbE1hcHBpbmcgbWFwcGluZyA9IGdldE1hcHBpbmcoa2V5Q291bnQpOworICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmcgIT0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMYWJlbE1hcHBpbmcgeworICAgICAgICBwcml2YXRlIFN0cmluZyBfb3JpZ0xhYmVsOworICAgICAgICBwcml2YXRlIFN0cmluZyBfbGFiZWw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gX2ltcGxpY2l0S2V5czsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIF9pc1dlbGxGb3JtZWQgPSB0cnVlOworICAgICAgICAKKyAgICAgICAgcHVibGljIExhYmVsTWFwcGluZyhTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgICAgIF9vcmlnTGFiZWwgPSBsYWJlbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5pdChsYWJlbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgX2lzV2VsbEZvcm1lZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaXZhdGUgdm9pZCBpbml0KFN0cmluZyBsYWJlbCkgeworICAgICAgICAgICAgaW50IGxQYXJlblBvcyA9IGxhYmVsLmluZGV4T2YoJygnKTsKKyAgICAgICAgICAgIGlmIChsUGFyZW5Qb3MgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBfbGFiZWwgPSBsYWJlbDsKKyAgICAgICAgICAgICAgICBfaW1wbGljaXRLZXlzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBpbXBsaWNpdEtleVRleHQgPSBsYWJlbC5zdWJzdHJpbmcobFBhcmVuUG9zKzEsIGxhYmVsLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBfbGFiZWwgPSBsYWJlbC5zdWJzdHJpbmcoMCwgbFBhcmVuUG9zKTsKKyAgICAgICAgICAgICAgICBpbXBsaWNpdEtleVRleHQgPSBpbXBsaWNpdEtleVRleHQucmVwbGFjZSgnKScsICcgJyk7CisgICAgICAgICAgICAgICAgX2ltcGxpY2l0S2V5cyA9IGltcGxpY2l0S2V5VGV4dC5zcGxpdCgiLCIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2ltcGxpY2l0S2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW1wbGljaXRLZXkgPSBfaW1wbGljaXRLZXlzW2ldLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbXBsaWNpdEtleSA9PSBudWxsKSB8fCAoIiIuZXF1YWxzKGltcGxpY2l0S2V5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pbXBsaWNpdEtleXNbaV0gPSAiX3VuZGVmIiArIEludGVnZXIudG9TdHJpbmcoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfaXNXZWxsRm9ybWVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBfaW1wbGljaXRLZXlzW2ldID0gaW1wbGljaXRLZXk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dlbGxGb3JtZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gX2lzV2VsbEZvcm1lZDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBfbGFiZWw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIF9sYWJlbC50b0xvd2VyQ2FzZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgaW50IGdldEltcGxpY2l0S2V5Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gX2ltcGxpY2l0S2V5cy5sZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW1wbGljaXRLZXkoaW50IGluZGV4KSB7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gX2ltcGxpY2l0S2V5cy5sZW5ndGgpIHJldHVybiBudWxsOworICAgICAgICAgICAgZWxzZSByZXR1cm4gX2ltcGxpY2l0S2V5c1tpbmRleF07CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gX29yaWdMYWJlbDsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy9jb3JlL3V0aWwvRW1mYXRpY0Jhc2ljVHlwZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS91dGlsL0VtZmF0aWNCYXNpY1R5cGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyZjFhYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS91dGlsL0VtZmF0aWNCYXNpY1R5cGVzLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CisKK3B1YmxpYyBjbGFzcyBFbWZhdGljQmFzaWNUeXBlcyB7CisKKwlwdWJsaWMgRW1mYXRpY0Jhc2ljVHlwZXMoKSB7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0QmFzaWNUeXBlcygpIHsKKwkJX25hbWVUb1R5cGUgPSBuZXcgSGFzaHRhYmxlKCk7CisJCV90eXBlVG9OYW1lID0gbmV3IEhhc2h0YWJsZSgpOworCisJCQorCQkKKwkJRWNvcmVQYWNrYWdlIGVjb3JlID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRTsKKwkJCisJCS8qCisJCSAqIGFsdGVybmF0ZSBub3RhdGlvbiAsIHdpbGwgYmUgdW5kZXJzdG9vZCB3aGVuIGdpdmVuIGluIC5lbWYgaG93ZXZlcgorCQkgKiB3aGVuIGltcG9ydGluZyBmcm9tIC5lY29yZSB0aGUgRW1mYXRpYy1wcmVmZXJyZWQgbmFtZXMgd2lsbCBiZQorCQkgKiBnZW5lcmF0ZWQgKHNlZSBiZWxvdykuIFRoaXMgYmVjYXVzZSB0aGUgZW50cmllcyBpbiB0aGUgbWFwIF90eXBlVG9OYW1lIGFyZQorCQkgKiBvdmVyd3JpdHRlbiAoc2FtZSBrZXlzKQorCQkgKi8KKwkJYWRkKCJFQm9vbGVhbiIsIGVjb3JlLmdldEVCb29sZWFuKCkpOworCQlhZGQoIkVCeXRlIiwgZWNvcmUuZ2V0RUJ5dGUoKSk7CisJCWFkZCgiRUNoYXIiLCBlY29yZS5nZXRFQ2hhcigpKTsKKwkJYWRkKCJFRG91YmxlIiwgZWNvcmUuZ2V0RURvdWJsZSgpKTsKKwkJYWRkKCJFRmxvYXQiLCBlY29yZS5nZXRFRmxvYXQoKSk7CisJCWFkZCgiRUludCIsIGVjb3JlLmdldEVJbnQoKSk7CisJCWFkZCgiRUxvbmciLCBlY29yZS5nZXRFTG9uZygpKTsKKwkJYWRkKCJFU2hvcnQiLCBlY29yZS5nZXRFU2hvcnQoKSk7CisJCWFkZCgiRUJvb2xlYW5PYmplY3QiLCBlY29yZS5nZXRFQm9vbGVhbk9iamVjdCgpKTsKKwkJYWRkKCJFQnl0ZU9iamVjdCIsIGVjb3JlLmdldEVCeXRlT2JqZWN0KCkpOworCQlhZGQoIkVDaGFyYWN0ZXJPYmplY3QiLCBlY29yZS5nZXRFQ2hhcmFjdGVyT2JqZWN0KCkpOworCQlhZGQoIkVEb3VibGVPYmplY3QiLCBlY29yZS5nZXRFRG91YmxlT2JqZWN0KCkpOworCQlhZGQoIkVGbG9hdE9iamVjdCIsIGVjb3JlLmdldEVGbG9hdE9iamVjdCgpKTsKKwkJYWRkKCJFSW50ZWdlck9iamVjdCIsIGVjb3JlLmdldEVJbnRlZ2VyT2JqZWN0KCkpOworCQlhZGQoIkVMb25nT2JqZWN0IiwgZWNvcmUuZ2V0RUxvbmdPYmplY3QoKSk7CisJCWFkZCgiRVNob3J0T2JqZWN0IiwgZWNvcmUuZ2V0RVNob3J0T2JqZWN0KCkpOworCQlhZGQoIkVEYXRlIiwgZWNvcmUuZ2V0RURhdGUoKSk7CisJCWFkZCgiRVN0cmluZyIsIGVjb3JlLmdldEVTdHJpbmcoKSk7CisJCWFkZCgiRUphdmFDbGFzcyIsIGVjb3JlLmdldEVKYXZhQ2xhc3MoKSk7CisKKwkJCisJCWFkZCgiYm9vbGVhbiIsIGVjb3JlLmdldEVCb29sZWFuKCkpOworCQlhZGQoImJ5dGUiLCBlY29yZS5nZXRFQnl0ZSgpKTsKKwkJYWRkKCJjaGFyIiwgZWNvcmUuZ2V0RUNoYXIoKSk7CisJCWFkZCgiZG91YmxlIiwgZWNvcmUuZ2V0RURvdWJsZSgpKTsKKwkJYWRkKCJmbG9hdCIsIGVjb3JlLmdldEVGbG9hdCgpKTsKKwkJYWRkKCJpbnQiLCBlY29yZS5nZXRFSW50KCkpOworCQlhZGQoImxvbmciLCBlY29yZS5nZXRFTG9uZygpKTsKKwkJYWRkKCJzaG9ydCIsIGVjb3JlLmdldEVTaG9ydCgpKTsKKwkJYWRkKCJCb29sZWFuIiwgZWNvcmUuZ2V0RUJvb2xlYW5PYmplY3QoKSk7CisJCWFkZCgiQnl0ZSIsIGVjb3JlLmdldEVCeXRlT2JqZWN0KCkpOworCQlhZGQoIkNoYXJhY3RlciIsIGVjb3JlLmdldEVDaGFyYWN0ZXJPYmplY3QoKSk7CisJCWFkZCgiRG91YmxlIiwgZWNvcmUuZ2V0RURvdWJsZU9iamVjdCgpKTsKKwkJYWRkKCJGbG9hdCIsIGVjb3JlLmdldEVGbG9hdE9iamVjdCgpKTsKKwkJYWRkKCJJbnRlZ2VyIiwgZWNvcmUuZ2V0RUludGVnZXJPYmplY3QoKSk7CisJCWFkZCgiTG9uZyIsIGVjb3JlLmdldEVMb25nT2JqZWN0KCkpOworCQlhZGQoIlNob3J0IiwgZWNvcmUuZ2V0RVNob3J0T2JqZWN0KCkpOworCQlhZGQoIkRhdGUiLCBlY29yZS5nZXRFRGF0ZSgpKTsKKwkJYWRkKCJTdHJpbmciLCBlY29yZS5nZXRFU3RyaW5nKCkpOworCQlhZGQoIk9iamVjdCIsIGVjb3JlLmdldEVKYXZhT2JqZWN0KCkpOworCQlhZGQoIkNsYXNzIiwgZWNvcmUuZ2V0RUphdmFDbGFzcygpKTsKKwkJYWRkKCJFT2JqZWN0IiwgZWNvcmUuZ2V0RU9iamVjdCgpKTsKKwkJYWRkKCJFQ2xhc3MiLCBlY29yZS5nZXRFQ2xhc3MoKSk7CisKKwkJLy8gRXh0ZXJuYWwgdHlwZXMgZGVmaW5lZCBieSBFY29yZQorCQlhZGQoIkVEYXRlIiwgZWNvcmUuZ2V0RURhdGUoKSk7CisJCWFkZCgiRUJpZ0ludGVnZXIiLCBlY29yZS5nZXRFQmlnSW50ZWdlcigpKTsKKwkJYWRkKCJFQmlnRGVjaW1hbCIsIGVjb3JlLmdldEVCaWdEZWNpbWFsKCkpOworCQlhZGQoIkVSZXNvdXJjZSIsIGVjb3JlLmdldEVSZXNvdXJjZSgpKTsKKwkJYWRkKCJFUmVzb3VyY2VTZXQiLCBlY29yZS5nZXRFUmVzb3VyY2VTZXQoKSk7CisJCWFkZCgiRUVudW1lcmF0b3IiLCBlY29yZS5nZXRFRW51bWVyYXRvcigpKTsKKwkJYWRkKCJFRUxpc3QiLCBlY29yZS5nZXRFRUxpc3QoKSk7CisJCWFkZCgiRVRyZWVJdGVyYXRvciIsIGVjb3JlLmdldEVUcmVlSXRlcmF0b3IoKSk7CisJCWFkZCgiRUphdmFPYmplY3QiLCBlY29yZS5nZXRFSmF2YU9iamVjdCgpKTsKKworCisJCV9hcnJheSA9IChTdHJpbmdbXSkgX3R5cGVUb05hbWUudmFsdWVzKCkudG9BcnJheShuZXcgU3RyaW5nW190eXBlVG9OYW1lLnNpemUoKV0pOworCQlfaXNJbml0aWFsaXplZCA9IHRydWU7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGQoU3RyaW5nIG5hbWUsIEVDbGFzc2lmaWVyIHR5cGUpIHsKKwkJX25hbWVUb1R5cGUucHV0KG5hbWUsIHR5cGUpOworCQlfdHlwZVRvTmFtZS5wdXQodHlwZSwgbmFtZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBHZXRCYXNpY1R5cGVOYW1lcygpIHsKKwkJaWYgKCFfaXNJbml0aWFsaXplZCkKKwkJCWluaXRCYXNpY1R5cGVzKCk7CisJCXJldHVybiAoU3RyaW5nW10pIF9hcnJheS5jbG9uZSgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgRUNsYXNzaWZpZXIgTG9va3VwQmFzaWNUeXBlKFN0cmluZyBuYW1lKSB7CisJCWlmICghX2lzSW5pdGlhbGl6ZWQpCisJCQlpbml0QmFzaWNUeXBlcygpOworCQlyZXR1cm4gKEVDbGFzc2lmaWVyKSBfbmFtZVRvVHlwZS5nZXQobmFtZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTG9va3VwQmFzaWNUeXBlTmFtZShFQ2xhc3NpZmllciBlQ2xhc3NpZmllcikgeworCQlpZiAoIV9pc0luaXRpYWxpemVkKQorCQkJaW5pdEJhc2ljVHlwZXMoKTsKKwkJcmV0dXJuIChTdHJpbmcpIF90eXBlVG9OYW1lLmdldChlQ2xhc3NpZmllcik7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBfaXNJbml0aWFsaXplZCA9IGZhbHNlOworCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBfbmFtZVRvVHlwZTsKKwlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgX3R5cGVUb05hbWU7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9hcnJheVtdOworCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvdXRpbC9FbWZhdGljS2V5d29yZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS91dGlsL0VtZmF0aWNLZXl3b3Jkcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiODNkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvdXRpbC9FbWZhdGljS2V5d29yZHMuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK3B1YmxpYyBjbGFzcyBFbWZhdGljS2V5d29yZHMKK3sKKworICAgIHB1YmxpYyBFbWZhdGljS2V5d29yZHMoKQorICAgIHsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRLZXl3b3JkcygpCisgICAgeworICAgICAgICBfYWxsS2V5d29yZHNUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgX25vcm1hbEtleXdvcmRzVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIF9zcGVjaWFsS2V5d29yZHNUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgX2hvdmVyVGV4dFRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBhZGQoImFic3RyYWN0IiwgIkVDbGFzcy5pc0Fic3RyYWN0KCkgPT0gPFQ+Iik7CisgICAgICAgIGFkZCgiYXR0ciIsIHRydWUpOworICAgICAgICBhZGQoImNsYXNzIiwgdHJ1ZSk7CisgICAgICAgIGFkZCgiZGF0YXR5cGUiLCB0cnVlKTsKKyAgICAgICAgYWRkKCJkZXJpdmVkIiwgIkVTdHJ1Y3R1cmFsRmVhdHVyZS5pc0Rlcml2ZWQoKSA9PSA8VD4iKTsKKyAgICAgICAgYWRkKCJlbnVtIiwgdHJ1ZSk7CisgICAgICAgIGFkZCgiZXh0ZW5kcyIpOworICAgICAgICBhZGQoInN1cGVyIik7CisgICAgICAgIGFkZCgiZmFsc2UiKTsKKyAgICAgICAgYWRkKCJpZCIsICJFQXR0cmlidXRlLmlzSUQoKSA9PSA8VD4iKTsKKyAgICAgICAgYWRkKCJpbXBvcnQiLCB0cnVlKTsKKyAgICAgICAgYWRkKCJpbnRlcmZhY2UiLCB0cnVlLCAiRUNsYXNzLmlzSW50ZXJmYWNlKCkgPT0gPFQ+Iik7CisgICAgICAgIGFkZCgibWFwZW50cnkiLCB0cnVlKTsKKyAgICAgICAgYWRkKCJvcCIsIHRydWUpOworICAgICAgICBhZGQoIm9yZGVyZWQiLCAiRVR5cGVkRWxlbWVudC5pc09yZGVyZWQoKSA9PSA8VD4iKTsKKyAgICAgICAgYWRkKCJwYWNrYWdlIiwgdHJ1ZSk7CisgICAgICAgIGFkZCgicmVhZG9ubHkiLCAiRVN0cnVjdHVyYWxGZWF0dXJlLmlzQ2hhbmdlYWJsZSgpID09IDxGPiIpOworICAgICAgICBhZGQoInJlZiIsIHRydWUsICJFUmVmZXJlbmNlLmlzQ29udGFpbm1lbnQoKSA9PSA8Rj4iKTsKKyAgICAgICAgYWRkKCJyZXNvbHZlIiwgIkVSZWZlcmVuY2UuaXNSZXNvbHZlUHJveGllcygpID09IDxUPiIpOworICAgICAgICBhZGQoInRocm93cyIpOworICAgICAgICBhZGQoInRyYW5zaWVudCIsICJFU3RydWN0dXJhbEZlYXR1cmUuaXNUcmFuc2llbnQoKSA9PSA8VD4iKTsKKyAgICAgICAgYWRkKCJ0cnVlIik7CisgICAgICAgIGFkZCgidW5pcXVlIiwgIkVUeXBlZEVsZW1lbnQuaXNVbmlxdWUoKSA9PSA8VD4iKTsKKyAgICAgICAgYWRkKCJ1bnNldHRhYmxlIiwgIkVTdHJ1Y3R1cmFsRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSA9PSA8VD4iKTsKKyAgICAgICAgYWRkKCJ2YWwiLCB0cnVlLCAiRVJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkgPT0gPFQ+Iik7CisgICAgICAgIGFkZCgidm9pZCIpOworICAgICAgICBhZGQoInZvbGF0aWxlIiwgIkVTdHJ1Y3R1cmFsRmVhdHVyZS5pc1ZvbGF0aWxlKCkgPT0gPFQ+Iik7CisgICAgICAgIF9hbGxLZXl3b3JkcyA9IChTdHJpbmdbXSlfYWxsS2V5d29yZHNUYWJsZS52YWx1ZXMoKS50b0FycmF5KG5ldyBTdHJpbmdbX2FsbEtleXdvcmRzVGFibGUuc2l6ZSgpXSk7CisgICAgICAgIF9ub3JtYWxLZXl3b3JkcyA9IChTdHJpbmdbXSlfbm9ybWFsS2V5d29yZHNUYWJsZS52YWx1ZXMoKS50b0FycmF5KG5ldyBTdHJpbmdbX25vcm1hbEtleXdvcmRzVGFibGUuc2l6ZSgpXSk7CisgICAgICAgIF9zcGVjaWFsS2V5d29yZHMgPSAoU3RyaW5nW10pX3NwZWNpYWxLZXl3b3Jkc1RhYmxlLnZhbHVlcygpLnRvQXJyYXkobmV3IFN0cmluZ1tfc3BlY2lhbEtleXdvcmRzVGFibGUuc2l6ZSgpXSk7CisgICAgICAgIF9pc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZChTdHJpbmcga2V5d29yZCkKKyAgICB7CisgICAgICAgIGFkZChrZXl3b3JkLCBmYWxzZSwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGQoU3RyaW5nIGtleXdvcmQsIGJvb2xlYW4gaXNTcGVjaWFsKQorICAgIHsKKyAgICAgICAgYWRkKGtleXdvcmQsIGlzU3BlY2lhbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGQoU3RyaW5nIGtleXdvcmQsIFN0cmluZyBob3ZlclRleHQpCisgICAgeworICAgICAgICBhZGQoa2V5d29yZCwgZmFsc2UsIGhvdmVyVGV4dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGQoU3RyaW5nIGtleXdvcmQsIGJvb2xlYW4gaXNTcGVjaWFsLCBTdHJpbmcgaG92ZXJUZXh0KQorICAgIHsKKyAgICAgICAgX2FsbEtleXdvcmRzVGFibGUucHV0KGtleXdvcmQsIGtleXdvcmQpOworICAgICAgICBpZihpc1NwZWNpYWwpCisgICAgICAgICAgICBfc3BlY2lhbEtleXdvcmRzVGFibGUucHV0KGtleXdvcmQsIGtleXdvcmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfbm9ybWFsS2V5d29yZHNUYWJsZS5wdXQoa2V5d29yZCwga2V5d29yZCk7CisgICAgICAgIGlmKGhvdmVyVGV4dCAhPSBudWxsKQorICAgICAgICAgICAgX2hvdmVyVGV4dFRhYmxlLnB1dChrZXl3b3JkLCBob3ZlclRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gR2V0S2V5d29yZHMoKQorICAgIHsKKyAgICAgICAgaWYoIV9pc0luaXRpYWxpemVkKQorICAgICAgICAgICAgaW5pdEtleXdvcmRzKCk7CisgICAgICAgIHJldHVybiAoU3RyaW5nW10pX2FsbEtleXdvcmRzLmNsb25lKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBHZXROb3JtYWxLZXl3b3JkcygpCisgICAgeworICAgICAgICBpZighX2lzSW5pdGlhbGl6ZWQpCisgICAgICAgICAgICBpbml0S2V5d29yZHMoKTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSlfbm9ybWFsS2V5d29yZHMuY2xvbmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIEdldFNwZWNpYWxLZXl3b3JkcygpCisgICAgeworICAgICAgICBpZighX2lzSW5pdGlhbGl6ZWQpCisgICAgICAgICAgICBpbml0S2V5d29yZHMoKTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSlfc3BlY2lhbEtleXdvcmRzLmNsb25lKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIElzS2V5d29yZChTdHJpbmcgaWQpCisgICAgeworICAgICAgICBpZighX2lzSW5pdGlhbGl6ZWQpCisgICAgICAgICAgICBpbml0S2V5d29yZHMoKTsKKyAgICAgICAgcmV0dXJuIF9hbGxLZXl3b3Jkc1RhYmxlLmNvbnRhaW5zS2V5KGlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBHZXRIb3ZlclRleHQoU3RyaW5nIGlkKQorICAgIHsKKyAgICAgICAgaWYoIV9pc0luaXRpYWxpemVkKQorICAgICAgICAgICAgaW5pdEtleXdvcmRzKCk7CisgICAgICAgIHJldHVybiAoU3RyaW5nKV9ob3ZlclRleHRUYWJsZS5nZXQoaWQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVzY2FwZShTdHJpbmcgaWQpCisgICAgeworICAgICAgICBpZighX2lzSW5pdGlhbGl6ZWQpCisgICAgICAgICAgICBpbml0S2V5d29yZHMoKTsKKyAgICAgICAgU3RyaW5nIGlkc1tdID0gaWQuc3BsaXQoIlxcLiIpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKElzS2V5d29yZChpZHNbaV0pKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChLRVlXT1JEX0VTQ0FQRV9TVFJJTkcgKyBpZHNbaV0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpZHNbaV0pOworICAgICAgICAgICAgaWYoaSArIDEgPCBpZHMubGVuZ3RoKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEtFWVdPUkRfRVNDQVBFX0NIQVIgPSAxMjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZV09SRF9FU0NBUEVfU1RSSU5HID0gU3RyaW5nLnZhbHVlT2YoJ34nKTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIF9pc0luaXRpYWxpemVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIF9hbGxLZXl3b3Jkc1RhYmxlOworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBfbm9ybWFsS2V5d29yZHNUYWJsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgX3NwZWNpYWxLZXl3b3Jkc1RhYmxlOworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBfaG92ZXJUZXh0VGFibGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9hbGxLZXl3b3Jkc1tdOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBfbm9ybWFsS2V5d29yZHNbXTsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX3NwZWNpYWxLZXl3b3Jkc1tdOworCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvdXRpbC9FbWZhdGljT3V0bGluZUJ1aWxkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvY29yZS91dGlsL0VtZmF0aWNPdXRsaW5lQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjlhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL2NvcmUvdXRpbC9FbWZhdGljT3V0bGluZUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDQ0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlRWRpdFBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucHJvdmlkZXIuRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmF0b3IuZWNvcmUuR2VuZXJhdGlvblBoYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJhdG9yLmVjb3JlLlRva2VuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lY29yZS5Ub2tlblRleHRCbGFua1NlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Cb3VuZEV4Y2VwdFdpbGRjYXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkNsYXNzRGVjbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5DbGFzc01lbWJlckRlY2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkNvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Db21wVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5EYXRhVHlwZURlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW1mYXRpY0FTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW1mYXRpY0FTVE5vZGVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkVudW1EZWNsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LktleUVxdWFsc1ZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0Lk9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5QYXJhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5QYXJhbXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlN1YlBhY2thZ2VEZWNsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlRvcExldmVsRGVjbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuVHlwZVBhcmFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlR5cGVQYXJhbXNJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLm91dGxpbmUuSU91dGxpbmVCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLm91dGxpbmUuT3V0bGluZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCisKK3B1YmxpYyBjbGFzcyBFbWZhdGljT3V0bGluZUJ1aWxkZXIgaW1wbGVtZW50cyBJT3V0bGluZUJ1aWxkZXIgeworCisJQ29tcFVuaXQgY29tcFVuaXQgPSBudWxsOworCU1hcDxBU1ROb2RlLCBPdXRsaW5lTm9kZT4gYTJvID0gbmV3IEhhc2hNYXA8QVNUTm9kZSwgT3V0bGluZU5vZGU+KCk7CisKKwlwdWJsaWMgRW1mYXRpY091dGxpbmVCdWlsZGVyKCkgeworCX0KKworCXB1YmxpYyBPdXRsaW5lTm9kZVtdIGJ1aWxkT3V0bGluZShBU1ROb2RlIHBhcnNlUm9vdCkgeworCQlhMm8uY2xlYXIoKTsKKwkJaWYgKHBhcnNlUm9vdCBpbnN0YW5jZW9mIENvbXBVbml0KSB7CisJCQlpZiAocGFyc2VSb290ICE9IG51bGwgJiYgKChDb21wVW5pdCkgcGFyc2VSb290KS5nZXRQYWNrYWdlRGVjbCgpICE9IG51bGwpIHsKKwkJCQljb21wVW5pdCA9IChDb21wVW5pdCkgcGFyc2VSb290OworCQkJCUltYWdlIGltYWdlID0gZ2V0UGFja2FnZUltYWdlKCk7CisJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gR2VuZXJhdGlvblBoYXNlLmdldElEVGV4dChjb21wVW5pdC5nZXRQYWNrYWdlRGVjbCgpLmdldE5hbWUoKSk7CisJCQkJT3V0bGluZU5vZGUgb3V0bGluZU5vZGUgPSBuZXcgT3V0bGluZU5vZGUoY29tcFVuaXQuZ2V0UGFja2FnZURlY2woKSwgcGFja2FnZU5hbWUsIGltYWdlKTsKKwkJCQlhMm8ucHV0KGNvbXBVbml0LmdldFBhY2thZ2VEZWNsKCkuZ2V0TmFtZSgpLCBvdXRsaW5lTm9kZSk7CisJCQkJYTJvLnB1dChjb21wVW5pdC5nZXRQYWNrYWdlRGVjbCgpLmdldFBhY2thZ2VfS1coKSwgb3V0bGluZU5vZGUpOworCQkJCWEyby5wdXQoY29tcFVuaXQuZ2V0UGFja2FnZURlY2woKS5nZXRTZW1pKCksIG91dGxpbmVOb2RlKTsKKwkJCQlkb1BhY2thZ2VDb250ZW50cyhvdXRsaW5lTm9kZSwgY29tcFVuaXQuZ2V0VG9wTGV2ZWxEZWNscygpKTsKKwkJCQljb21wVW5pdC5zZXRDc3QyT3V0bGluZShhMm8pOworCQkJCU91dGxpbmVOb2RlW10gb3V0bGluZU5vZGVzID0gbmV3IE91dGxpbmVOb2RlW10geyBvdXRsaW5lTm9kZSB9OworCQkJCXJldHVybiBvdXRsaW5lTm9kZXM7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRvUGFja2FnZUNvbnRlbnRzKGZpbmFsIE91dGxpbmVOb2RlIHBhcmVudE5vZGUsIFRvcExldmVsRGVjbHMgdG9wTGV2ZWxEZWNscykgeworCQkobmV3IEVtZmF0aWNBU1ROb2RlVmlzaXRvcigpIHsKKworCQkJLy8gVE9ETyBNYXBFbnRyeURlY2wgaXMgbm90IGJlaW5nIHNob3duIGluIG91dGxpbmUKKworCQkJcHJpdmF0ZSB2b2lkIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGUgYywgT3V0bGluZU5vZGUgb3V0bGluZU5vZGUpIHsKKwkJCQlBdHRyaWJ1dGUgYXQgPSAoQXR0cmlidXRlKSBjOworCQkJCVN0cmluZyBzdHJUeXBlV2l0aE11bHRpID0gVG9rZW5UZXh0QmxhbmtTZXAuR2V0KGMuZ2V0VHlwZVdpdGhNdWx0aSgpKTsKKwkJCQlTdHJpbmcgc3RyTmFtZSA9IEdlbmVyYXRpb25QaGFzZS5nZXRJRFRleHQoYXQuZ2V0TmFtZSgpKTsKKwkJCQlPdXRsaW5lTm9kZSBuID0gbmV3IE91dGxpbmVOb2RlKGF0LmdldE5hbWUoKSwgc3RyTmFtZSArICIgOiAiICsgc3RyVHlwZVdpdGhNdWx0aSwgRW1mYXRpY091dGxpbmVCdWlsZGVyCisJCQkJCQkuZ2V0QXR0cmlidXRlSW1hZ2UoKSk7CisJCQkJYTJvLnB1dChhdCwgbik7CisJCQkJQVNUTm9kZVtdIGF0QW5ucyA9IGF0LmdldEFubm90YXRpb25zKCkuZ2V0Q2hpbGRyZW4oKTsKKwkJCQlhbm5vdGF0ZShhdEFubnMsIG4pOworCQkJCW91dGxpbmVOb2RlLmFkZENoaWxkKG4pOworCQkJfQorCisJCQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NEZWNsTWVtYmVycyhDbGFzc0RlY2wgY2xhc3NEZWNsLCBPdXRsaW5lTm9kZSBvdXRsaW5lTm9kZSkgeworCQkJCUNsYXNzTWVtYmVyRGVjbHMgbXMgPSBjbGFzc0RlY2wuZ2V0Q2xhc3NNZW1iZXJEZWNscygpOworCisJCQkJQVNUTm9kZVtdIGFucyA9IGNsYXNzRGVjbC5nZXRBbm5vdGF0aW9ucygpLmdldENoaWxkcmVuKCk7CisJCQkJYW5ub3RhdGUoYW5zLCBvdXRsaW5lTm9kZSk7CisKKwkJCQlmb3IgKEFTVE5vZGUgYyA6IG1zLmdldENoaWxkcmVuKCkpIHsKKwkJCQkJaWYgKGMgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKKwkJCQkJCWFkZEF0dHJpYnV0ZSgoQXR0cmlidXRlKSBjLCBvdXRsaW5lTm9kZSk7CisJCQkJCX0KKwkJCQkJaWYgKGMgaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHsKKwkJCQkJCWFkZFJlZmVyZW5jZSgoUmVmZXJlbmNlKSBjLCBvdXRsaW5lTm9kZSk7CisJCQkJCX0KKwkJCQkJaWYgKGMgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKKwkJCQkJCWFkZE9wZXJhdGlvbigoT3BlcmF0aW9uKSBjLCBvdXRsaW5lTm9kZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXByaXZhdGUgdm9pZCBhZGRPcGVyYXRpb24oT3BlcmF0aW9uIGMsIE91dGxpbmVOb2RlIG91dGxpbmVOb2RlKSB7CisJCQkJT3BlcmF0aW9uIG8gPSAoT3BlcmF0aW9uKSBjOworCQkJCVN0cmluZyBzdHJSZXN1bHRUeXBlID0gVG9rZW5UZXh0QmxhbmtTZXAuR2V0KG8uZ2V0UmVzVHlwZSgpKTsKKwkJCQlTdHJpbmcgc3RyTmFtZSA9IEdlbmVyYXRpb25QaGFzZS5nZXRJRFRleHQoby5nZXROYW1lKCkpOworCQkJCU91dGxpbmVOb2RlIG4gPSBuZXcgT3V0bGluZU5vZGUoby5nZXROYW1lKCksIHN0ck5hbWUgKyAiIDogIiArIHN0clJlc3VsdFR5cGUsIEVtZmF0aWNPdXRsaW5lQnVpbGRlcgorCQkJCQkJLmdldE9wZXJhdGlvbkltYWdlKCkpOworCQkJCWEyby5wdXQobywgbik7CisJCQkJQVNUTm9kZVtdIG9Bbm5zID0gby5nZXRBbm5vdGF0aW9ucygpLmdldENoaWxkcmVuKCk7CisJCQkJYW5ub3RhdGUob0FubnMsIG4pOworCQkJCW91dGxpbmVOb2RlLmFkZENoaWxkKG4pOworCQkJCS8vIGVHZW5lcmljRXhjZXB0aW9uVHlwZXMKKwkJCQlDb21tYUxpc3RCb3VuZEV4Y2VwdFdpbGQgZXhjcyA9IGMuZ2V0RXhjZXB0aW9ucygpOworCQkJCWFkZEV4Y2VwdGlvbnMoZXhjcywgbik7CisJCQkJLy8gVE9ETyBhZGQgZUdlbmVyaWNSZXR1cm5UeXBlCisJCQkJVHlwZVBhcmFtc0luZm8gdHBpID0gYy5nZXRUeXBlUGFyYW1zSW5mbygpOworCQkJCWFkZFR5cGVQYXJhbXModHBpLCBuKTsKKwkJCQlhZGRQYXJhbXMoby5nZXRQYXJhbXMoKSwgbik7CisJCQl9CisKKwkJCXByaXZhdGUgdm9pZCBhZGRFeGNlcHRpb25zKENvbW1hTGlzdEJvdW5kRXhjZXB0V2lsZCBleGNzLCBPdXRsaW5lTm9kZSBuKSB7CisJCQkJaWYgKGV4Y3MgPT0gbnVsbCkgeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWZvciAoQVNUTm9kZSBlbiA6IGV4Y3MuZ2V0Q2hpbGRyZW4oKSkgeworCQkJCQlpZiAoZW4gaW5zdGFuY2VvZiBCb3VuZEV4Y2VwdFdpbGRjYXJkKSB7CisJCQkJCQlCb3VuZEV4Y2VwdFdpbGRjYXJkIGJldyA9IChCb3VuZEV4Y2VwdFdpbGRjYXJkKSBlbjsKKwkJCQkJCU91dGxpbmVOb2RlIGUgPSBudWxsOworCQkJCQkJU3RyaW5nIHN0clRleHQgPSBUb2tlblRleHQuR2V0KGJldyk7CisJCQkJCQlpZiAoYmV3LmdldE9uZU9yTW9yZVR5cGVBcmdzKCkgIT0gbnVsbCkgeworCQkJCQkJCS8vIGdlbmVyaWMgZXhjZXB0aW9uCisJCQkJCQkJZSA9IG5ldyBPdXRsaW5lTm9kZShlbiwgc3RyVGV4dCwgZ2V0R2VuZXJpY0V4Y2VwdGlvbkltYWdlKCkpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQllID0gbmV3IE91dGxpbmVOb2RlKGVuLCBzdHJUZXh0KTsKKwkJCQkJCX0KKwkJCQkJCWEyby5wdXQoYmV3LCBlKTsKKwkJCQkJCW4uYWRkQ2hpbGQoZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXByaXZhdGUgdm9pZCBhZGRQYXJhbXMoUGFyYW1zIHBhcmFtcywgT3V0bGluZU5vZGUgb24pIHsKKwkJCQlpZiAocGFyYW1zID09IG51bGwpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlBU1ROb2RlW10gcHMgPSBwYXJhbXMuZ2V0Q2hpbGRyZW4oKTsKKwkJCQlmb3IgKEFTVE5vZGUgcG4gOiBwcykgeworCQkJCQlpZiAocG4gaW5zdGFuY2VvZiBQYXJhbSkgeworCQkJCQkJUGFyYW0gcCA9IChQYXJhbSkgcG47CisJCQkJCQlTdHJpbmcgc3RyVHlwZVdpdGhNdWx0aSA9IFRva2VuVGV4dEJsYW5rU2VwLkdldChwLmdldFR5cGVXaXRoTXVsdGkoKSk7CisJCQkJCQlTdHJpbmcgc3RyTmFtZSA9IEdlbmVyYXRpb25QaGFzZS5nZXRJRFRleHQocC5nZXROYW1lKCkpOworCQkJCQkJT3V0bGluZU5vZGUgbiA9IG5ldyBPdXRsaW5lTm9kZShwLCBzdHJOYW1lICsgIiA6ICIgKyBzdHJUeXBlV2l0aE11bHRpLCBFbWZhdGljT3V0bGluZUJ1aWxkZXIKKwkJCQkJCQkJLmdldFBhcmFtSW1hZ2UoKSk7CisJCQkJCQlhMm8ucHV0KHAsIG4pOworCQkJCQkJb24uYWRkQ2hpbGQobik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXByaXZhdGUgdm9pZCBhZGRSZWZlcmVuY2UoUmVmZXJlbmNlIGMsIE91dGxpbmVOb2RlIG91dGxpbmVOb2RlKSB7CisJCQkJUmVmZXJlbmNlIHIgPSAoUmVmZXJlbmNlKSBjOworCQkJCVN0cmluZyBzdHJUeXBlV2l0aE11bHRpID0gVG9rZW5UZXh0QmxhbmtTZXAuR2V0KGMuZ2V0VHlwZVdpdGhNdWx0aSgpKTsKKwkJCQlTdHJpbmcgc3RyTmFtZSA9IEdlbmVyYXRpb25QaGFzZS5nZXRJRFRleHQoci5nZXROYW1lKCkpOworCQkJCU91dGxpbmVOb2RlIG4gPSBuZXcgT3V0bGluZU5vZGUoci5nZXROYW1lKCksIHN0ck5hbWUgKyAiIDogIiArIHN0clR5cGVXaXRoTXVsdGksIEVtZmF0aWNPdXRsaW5lQnVpbGRlcgorCQkJCQkJLmdldFJlZmVyZW5jZUltYWdlKCkpOworCQkJCWEyby5wdXQociwgbik7CisJCQkJQVNUTm9kZVtdIHJBbm5zID0gci5nZXRBbm5vdGF0aW9ucygpLmdldENoaWxkcmVuKCk7CisJCQkJYW5ub3RhdGUockFubnMsIG4pOworCQkJCW91dGxpbmVOb2RlLmFkZENoaWxkKG4pOworCQkJfQorCisJCQlwcml2YXRlIHZvaWQgYWRkVHlwZVBhcmFtcyhUeXBlUGFyYW1zSW5mbyB0cGksIE91dGxpbmVOb2RlIG91dGxpbmVOb2RlKSB7CisJCQkJaWYgKHRwaSA9PSBudWxsIHx8IHRwaS5nZXRPbmVPck1vcmVUeXBlUGFyYW1zKCkgPT0gbnVsbCkgeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCUFTVE5vZGVbXSB0cHMgPSB0cGkuZ2V0T25lT3JNb3JlVHlwZVBhcmFtcygpLmdldENoaWxkcmVuKCk7CisJCQkJZm9yIChBU1ROb2RlIHRwbiA6IHRwcykgeworCQkJCQlpZiAodHBuIGluc3RhbmNlb2YgVHlwZVBhcmFtKSB7CisJCQkJCQlUeXBlUGFyYW0gdHAgPSAoVHlwZVBhcmFtKSB0cG47CisJCQkJCQlTdHJpbmcgc3RyVHlwZVZhck5hbWUgPSBHZW5lcmF0aW9uUGhhc2UuZ2V0SURUZXh0KHRwLmdldFR5cGVWYXJOYW1lKCkpOworCQkJCQkJT3V0bGluZU5vZGUgbiA9IG5ldyBPdXRsaW5lTm9kZSh0cCwgc3RyVHlwZVZhck5hbWUsIEVtZmF0aWNPdXRsaW5lQnVpbGRlci5nZXRUeXBlUGFyYW1JbWFnZSgpKTsKKwkJCQkJCWEyby5wdXQodHAsIG4pOworCQkJCQkJb3V0bGluZU5vZGUuYWRkQ2hpbGQobik7CisJCQkJCQkvLyBhZGQgYm91bmRzIGFzIGNoaWxkcmVuIG9mIHRoZSBub2RlIGZvciB0aGUgdHlwZSBwYXJhbQorCQkJCQkJaWYgKHRwLmdldFR5cGVCb3VuZHNJbmZvKCkgIT0gbnVsbAorCQkJCQkJCQkmJiB0cC5nZXRUeXBlQm91bmRzSW5mbygpLmdldE9uZU9yTW9yZVR5cGVQYXJhbUJvdW5kcygpICE9IG51bGwpIHsKKwkJCQkJCQlBU1ROb2RlW10gYm91bmROb2RlcyA9IHRwLmdldFR5cGVCb3VuZHNJbmZvKCkuZ2V0T25lT3JNb3JlVHlwZVBhcmFtQm91bmRzKCkuZ2V0Q2hpbGRyZW4oKTsKKwkJCQkJCQlmb3IgKEFTVE5vZGUgYm91bmQgOiBib3VuZE5vZGVzKSB7CisJCQkJCQkJCVN0cmluZyBib3VuZExhYmVsID0gVG9rZW5UZXh0QmxhbmtTZXAuR2V0KChFbWZhdGljQVNUTm9kZSkgYm91bmQpOworCQkJCQkJCQlPdXRsaW5lTm9kZSBuMiA9IG5ldyBPdXRsaW5lTm9kZShib3VuZCwgYm91bmRMYWJlbCk7CisJCQkJCQkJCWEyby5wdXQoYm91bmQsIG4yKTsKKwkJCQkJCQkJbi5hZGRDaGlsZChuMik7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQl9CisKKwkJCXByaXZhdGUgdm9pZCBhbm5vdGF0ZShBU1ROb2RlW10gYXMsIE91dGxpbmVOb2RlIG9uKSB7CisJCQkJLy8gZWFjaCBhbm5vdGF0aW9uIHdpbGwgYmUgYWRkZWQgYXMgYSBjaGlsZAorCQkJCWZvciAoQVNUTm9kZSBhc3ROb2RlIDogYXMpIHsKKwkJCQkJQW5ub3RhdGlvbiBhc3RBbm4gPSAoQW5ub3RhdGlvbikgYXN0Tm9kZTsKKwkJCQkJU3RyaW5nIHN0clNvdXJjZSA9IFRva2VuVGV4dC5HZXQoYXN0QW5uLmdldFNvdXJjZSgpKTsKKwkJCQkJT3V0bGluZU5vZGUgbiA9IG5ldyBPdXRsaW5lTm9kZShhc3ROb2RlLCBzdHJTb3VyY2UsIEVtZmF0aWNPdXRsaW5lQnVpbGRlci5nZXRBbm5vdGF0aW9uSW1hZ2UoKSk7CisJCQkJCWEyby5wdXQoYXN0QW5uLCBuKTsKKwkJCQkJZm9yIChBU1ROb2RlIGt2IDogYXN0QW5uLmdldEtleUVxdWFsc1ZhbHVlTGlzdCgpLmdldENoaWxkcmVuKCkpIHsKKwkJCQkJCWlmIChrdiBpbnN0YW5jZW9mIEtleUVxdWFsc1ZhbHVlKSB7CisJCQkJCQkJU3RyaW5nIHN0cktleSA9IGt2LmdldENoaWxkKDApLmdldENoaWxkKDApLmdldEZpcnN0Q2hpbGQoKS5nZXRUZXh0KCk7CisJCQkJCQkJU3RyaW5nIHN0clZhbHVlID0ga3YuZ2V0Q2hpbGQoMikuZ2V0Q2hpbGQoMCkuZ2V0VGV4dCgpOworCQkJCQkJCVN0cmluZyBzdHJLViA9IHN0cktleSArICIgPSAiICsgc3RyVmFsdWU7CisJCQkJCQkJT3V0bGluZU5vZGUgbjIgPSBuZXcgT3V0bGluZU5vZGUoa3YsIHN0cktWLCBudWxsKTsKKwkJCQkJCQlhMm8ucHV0KGt2LCBuMik7CisJCQkJCQkJbi5hZGRDaGlsZChuMik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJb24uYWRkQ2hpbGQobik7CisJCQkJfQorCQkJfQorCisJCQlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KENsYXNzRGVjbCBjbGFzc0RlY2wpIHsKKwkJCQlTdHJpbmcgbmFtZSA9IGNsYXNzRGVjbC5nZXROYW1lKCkuZ2V0VGV4dCgpOworCQkJCUltYWdlIGltYWdlID0gRW1mYXRpY091dGxpbmVCdWlsZGVyLmdldENsYXNzSW1hZ2UoKTsKKwkJCQlPdXRsaW5lTm9kZSBvdXRsaW5lTm9kZSA9IG5ldyBPdXRsaW5lTm9kZShjbGFzc0RlY2wsIG5hbWUsIGltYWdlKTsKKwkJCQlhMm8ucHV0KGNsYXNzRGVjbCwgb3V0bGluZU5vZGUpOworCQkJCWFkZFR5cGVQYXJhbXMoY2xhc3NEZWNsLmdldFR5cGVQYXJhbXNJbmZvKCksIG91dGxpbmVOb2RlKTsKKwkJCQlhZGRDbGFzc0RlY2xNZW1iZXJzKGNsYXNzRGVjbCwgb3V0bGluZU5vZGUpOworCQkJCS8vIFRPRE8gZGVjaWRlIHdoZXRoZXIgdG8gYWRkIHN1cGVydHlwZXMKKwkJCQlwYXJlbnROb2RlLmFkZENoaWxkKG91dGxpbmVOb2RlKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCXB1YmxpYyBib29sZWFuIGJlZ2luVmlzaXQoRGF0YVR5cGVEZWNsIGRhdGFUeXBlRGVjbCkgeworCQkJCVN0cmluZyBuYW1lID0gZGF0YVR5cGVEZWNsLmdldE5hbWUoKS5nZXRUZXh0KCk7CisJCQkJSW1hZ2UgaW1hZ2UgPSBFbWZhdGljT3V0bGluZUJ1aWxkZXIuZ2V0RGF0YVR5cGVJbWFnZSgpOworCQkJCU91dGxpbmVOb2RlIG91dGxpbmVOb2RlID0gbmV3IE91dGxpbmVOb2RlKGRhdGFUeXBlRGVjbCwgbmFtZSwgaW1hZ2UpOworCQkJCWEyby5wdXQoZGF0YVR5cGVEZWNsLCBvdXRsaW5lTm9kZSk7CisJCQkJcGFyZW50Tm9kZS5hZGRDaGlsZChvdXRsaW5lTm9kZSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KEVudW1EZWNsIGVudW1EZWNsKSB7CisJCQkJU3RyaW5nIG5hbWUgPSBlbnVtRGVjbC5nZXROYW1lKCkuZ2V0VGV4dCgpOworCQkJCUltYWdlIGltYWdlID0gRW1mYXRpY091dGxpbmVCdWlsZGVyLmdldEVudW1JbWFnZSgpOworCQkJCU91dGxpbmVOb2RlIG91dGxpbmVOb2RlID0gbmV3IE91dGxpbmVOb2RlKGVudW1EZWNsLCBuYW1lLCBpbWFnZSk7CisJCQkJYTJvLnB1dChlbnVtRGVjbCwgb3V0bGluZU5vZGUpOworCQkJCXBhcmVudE5vZGUuYWRkQ2hpbGQob3V0bGluZU5vZGUpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJcHVibGljIGJvb2xlYW4gYmVnaW5WaXNpdChTdWJQYWNrYWdlRGVjbCBzdWJQYWNrYWdlRGVjbCkgeworCQkJCVN0cmluZyBuYW1lID0gR2VuZXJhdGlvblBoYXNlLmdldElEVGV4dChzdWJQYWNrYWdlRGVjbC5nZXROYW1lKCkpOworCQkJCUltYWdlIGltYWdlID0gRW1mYXRpY091dGxpbmVCdWlsZGVyLmdldFBhY2thZ2VJbWFnZSgpOworCQkJCU91dGxpbmVOb2RlIG91dGxpbmVOb2RlID0gbmV3IE91dGxpbmVOb2RlKHN1YlBhY2thZ2VEZWNsLCBuYW1lLCBpbWFnZSk7CisKKwkJCQlhMm8ucHV0KHN1YlBhY2thZ2VEZWNsLmdldE5hbWUoKSwgb3V0bGluZU5vZGUpOworCQkJCWEyby5wdXQoc3ViUGFja2FnZURlY2wuZ2V0UGFja2FnZV9LVygpLCBvdXRsaW5lTm9kZSk7CisJCQkJYTJvLnB1dChzdWJQYWNrYWdlRGVjbC5nZXRMY3VybHkoKSwgb3V0bGluZU5vZGUpOworCisJCQkJcGFyZW50Tm9kZS5hZGRDaGlsZChvdXRsaW5lTm9kZSk7CisJCQkJZG9QYWNrYWdlQ29udGVudHMob3V0bGluZU5vZGUsIHN1YlBhY2thZ2VEZWNsLmdldFRvcExldmVsRGVjbHMoKSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCX0pLnZpc2l0KHRvcExldmVsRGVjbHMpOworCX0KKworCXByaXZhdGUgc3RhdGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAoX2FkYXB0ZXJGYWN0b3J5ID09IG51bGwpCisJCQlfYWRhcHRlckZhY3RvcnkgPSBuZXcgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCQlyZXR1cm4gX2FkYXB0ZXJGYWN0b3J5OworCX0KKworCXN0YXRpYyBJbWFnZSBnZXRQYWNrYWdlSW1hZ2UoKSB7CisJCWlmIChfcGFja2FnZUltYWdlID09IG51bGwpIHsKKwkJCU9iamVjdCBlUGFja2FnZSA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRVBhY2thZ2UoKTsKKwkJCV9wYWNrYWdlSW1hZ2UgPSBnZXRJbWFnZShlUGFja2FnZSk7CisJCX0KKwkJcmV0dXJuIF9wYWNrYWdlSW1hZ2U7CisJfQorCisJc3RhdGljIEltYWdlIGdldENsYXNzSW1hZ2UoKSB7CisJCWlmIChfY2xhc3NJbWFnZSA9PSBudWxsKSB7CisJCQlPYmplY3QgZVBhY2thZ2UgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVDbGFzcygpOworCQkJX2NsYXNzSW1hZ2UgPSBnZXRJbWFnZShlUGFja2FnZSk7CisJCX0KKwkJcmV0dXJuIF9jbGFzc0ltYWdlOworCX0KKworCXN0YXRpYyBJbWFnZSBnZXRFbnVtSW1hZ2UoKSB7CisJCWlmIChfZW51bUltYWdlID09IG51bGwpIHsKKwkJCU9iamVjdCBlUGFja2FnZSA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUVudW0oKTsKKwkJCV9lbnVtSW1hZ2UgPSBnZXRJbWFnZShlUGFja2FnZSk7CisJCX0KKwkJcmV0dXJuIF9lbnVtSW1hZ2U7CisJfQorCisJc3RhdGljIEltYWdlIGdldERhdGFUeXBlSW1hZ2UoKSB7CisJCWlmIChfZGF0YVR5cGVJbWFnZSA9PSBudWxsKSB7CisJCQlPYmplY3QgZVBhY2thZ2UgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVEYXRhVHlwZSgpOworCQkJX2RhdGFUeXBlSW1hZ2UgPSBnZXRJbWFnZShlUGFja2FnZSk7CisJCX0KKwkJcmV0dXJuIF9kYXRhVHlwZUltYWdlOworCX0KKworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0T3BlcmF0aW9uSW1hZ2UoKSB7CisJCWlmIChfb3BlcmF0aW9uSW1hZ2UgPT0gbnVsbCkgeworCQkJT2JqZWN0IGVPcGVyYXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVPcGVyYXRpb24oKTsKKwkJCV9vcGVyYXRpb25JbWFnZSA9IGdldEltYWdlKGVPcGVyYXRpb24pOworCQl9CisJCXJldHVybiBfb3BlcmF0aW9uSW1hZ2U7CisJfQorCisJcHVibGljIHN0YXRpYyBJbWFnZSBnZXRBbm5vdGF0aW9uSW1hZ2UoKSB7CisJCWlmIChfYW5ub3RhdGlvbkltYWdlID09IG51bGwpIHsKKwkJCU9iamVjdCBlQW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUFubm90YXRpb24oKTsKKwkJCV9hbm5vdGF0aW9uSW1hZ2UgPSBnZXRJbWFnZShlQW5ub3RhdGlvbik7CisJCX0KKwkJcmV0dXJuIF9hbm5vdGF0aW9uSW1hZ2U7CisJfQorCisJcHVibGljIHN0YXRpYyBJbWFnZSBnZXRBdHRyaWJ1dGVJbWFnZSgpIHsKKwkJaWYgKF9hdHRyaWJ1dGVJbWFnZSA9PSBudWxsKSB7CisJCQlPYmplY3QgZUF0dHJpYnV0ZSA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUF0dHJpYnV0ZSgpOworCQkJX2F0dHJpYnV0ZUltYWdlID0gZ2V0SW1hZ2UoZUF0dHJpYnV0ZSk7CisJCX0KKwkJcmV0dXJuIF9hdHRyaWJ1dGVJbWFnZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEltYWdlIGdldFJlZmVyZW5jZUltYWdlKCkgeworCQlpZiAoX3JlZmVyZW5jZUltYWdlID09IG51bGwpIHsKKwkJCU9iamVjdCBlUmVmZXJlbmNlID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFUmVmZXJlbmNlKCk7CisJCQlfcmVmZXJlbmNlSW1hZ2UgPSBnZXRJbWFnZShlUmVmZXJlbmNlKTsKKwkJfQorCQlyZXR1cm4gX3JlZmVyZW5jZUltYWdlOworCX0KKworCXN0YXRpYyBJbWFnZSBnZXRUeXBlUGFyYW1JbWFnZSgpIHsKKwkJaWYgKF90eXBlUGFyYW1JbWFnZSA9PSBudWxsKSB7CisJCQlPYmplY3QgZXRwID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFVHlwZVBhcmFtZXRlcigpOworCQkJX3R5cGVQYXJhbUltYWdlID0gZ2V0SW1hZ2UoZXRwKTsKKwkJfQorCQlyZXR1cm4gX3R5cGVQYXJhbUltYWdlOworCX0KKworCXN0YXRpYyBJbWFnZSBnZXRQYXJhbUltYWdlKCkgeworCQlpZiAoX3BhcmFtSW1hZ2UgPT0gbnVsbCkgeworCQkJT2JqZWN0IGVwID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFUGFyYW1ldGVyKCk7CisJCQlfcGFyYW1JbWFnZSA9IGdldEltYWdlKGVwKTsKKwkJfQorCQlyZXR1cm4gX3BhcmFtSW1hZ2U7CisJfQorCisJc3RhdGljIEltYWdlIGdldEdlbmVyaWNFeGNlcHRpb25JbWFnZSgpIHsKKwkJaWYgKF9nZW5lcmljRXhjZXB0aW9uSW1hZ2UgPT0gbnVsbCkgeworCQkJX2dlbmVyaWNFeGNlcHRpb25JbWFnZSA9IChJbWFnZSkgRWNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0VHZW5lcmljRXhjZXB0aW9uIik7CisJCX0KKwkJcmV0dXJuIF9nZW5lcmljRXhjZXB0aW9uSW1hZ2U7CisJfQorCisJc3RhdGljIEltYWdlIGdldEdlbmVyaWNFbGVtZW50VHlwZUltYWdlKCkgeworCQlpZiAoX2dlbmVyaWNFbGVtZW50VHlwZUltYWdlID09IG51bGwpIHsKKwkJCV9nZW5lcmljRWxlbWVudFR5cGVJbWFnZSA9IChJbWFnZSkgRWNvcmVFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0VHZW5lcmljRWxlbWVudFR5cGUiKTsKKwkJfQorCQlyZXR1cm4gX2dlbmVyaWNFbGVtZW50VHlwZUltYWdlOworCX0KKworCXN0YXRpYyBJbWFnZSBnZXRHZW5lcmljU3VwZXJUeXBlSW1hZ2UoKSB7CisJCWlmIChfZ2VuZXJpY1N1cGVyVHlwZUltYWdlID09IG51bGwpIHsKKwkJCV9nZW5lcmljU3VwZXJUeXBlSW1hZ2UgPSAoSW1hZ2UpIEVjb3JlRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9FR2VuZXJpY1N1cGVyVHlwZSIpOworCQl9CisJCXJldHVybiBfZ2VuZXJpY1N1cGVyVHlwZUltYWdlOworCX0KKworCXN0YXRpYyBJbWFnZSBnZXRHZW5lcmljV2lsZGNhcmRJbWFnZSgpIHsKKwkJaWYgKF9nZW5lcmljV2lsZGNhcmRJbWFnZSA9PSBudWxsKSB7CisJCQlfZ2VuZXJpY1dpbGRjYXJkSW1hZ2UgPSAoSW1hZ2UpIEVjb3JlRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9FR2VuZXJpY1dpbGRjYXJkIik7CisJCX0KKwkJcmV0dXJuIF9nZW5lcmljV2lsZGNhcmRJbWFnZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZU9iamVjdCkgeworCQlJSXRlbUxhYmVsUHJvdmlkZXIgaXRlbUxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGVPYmplY3QsCisJCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKwkJT2JqZWN0IGltYWdlT2JqZWN0ID0gaXRlbUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZU9iamVjdCk7CisJCUltYWdlIGltYWdlID0gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoaW1hZ2VPYmplY3QpOworCQlyZXR1cm4gaW1hZ2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRWNvcmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBfYWRhcHRlckZhY3Rvcnk7CisKKwlwcml2YXRlIHN0YXRpYyBJbWFnZSBfcGFja2FnZUltYWdlOworCisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgX2NsYXNzSW1hZ2U7CisKKwlwcml2YXRlIHN0YXRpYyBJbWFnZSBfZW51bUltYWdlOworCisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgX2RhdGFUeXBlSW1hZ2U7CisKKwlwcml2YXRlIHN0YXRpYyBJbWFnZSBfb3BlcmF0aW9uSW1hZ2U7CisKKwlwcml2YXRlIHN0YXRpYyBJbWFnZSBfYW5ub3RhdGlvbkltYWdlOworCisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgX2F0dHJpYnV0ZUltYWdlOworCisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgX3JlZmVyZW5jZUltYWdlOworCisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgX3R5cGVQYXJhbUltYWdlOworCisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgX3BhcmFtSW1hZ2U7CisKKwlwcml2YXRlIHN0YXRpYyBJbWFnZSBfZ2VuZXJpY0V4Y2VwdGlvbkltYWdlOworCisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgX2dlbmVyaWNFbGVtZW50VHlwZUltYWdlOworCisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgX2dlbmVyaWNTdXBlclR5cGVJbWFnZTsKKworCXByaXZhdGUgc3RhdGljIEltYWdlIF9nZW5lcmljV2lsZGNhcmRJbWFnZTsKKworCS8qKgorCSAqIFRoaXMgb3ZlcmxheXMgdGhlIHNlY29uZCBpbWFnZSBvbiB0aGUgZmlyc3QuCisJICovCisJcHVibGljIHN0YXRpYyBJbWFnZSBvdmVybGF5SW1hZ2UoSW1hZ2UgZmlyc3QsIEltYWdlIHNlY29uZCkgeworCQlMaXN0PEltYWdlPiBpbWFnZXMgPSBuZXcgQXJyYXlMaXN0PEltYWdlPigyKTsKKwkJaW1hZ2VzLmFkZChmaXJzdCk7CisJCWltYWdlcy5hZGQoc2Vjb25kKTsKKwkJQ29tcG9zZWRJbWFnZSBpbWFnZU9iamVjdCA9IG5ldyBDb21wb3NlZEltYWdlKGltYWdlcyk7CisJCUltYWdlIGltYWdlID0gKEltYWdlKSBpbWFnZU9iamVjdC5nZXRJbWFnZXMoKS5nZXQoMCk7IC8vIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlT2JqZWN0KTsKKwkJcmV0dXJuIGltYWdlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NWFjMDYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMDc3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2M1NDc2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9FQW5ub3RhdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9FQW5ub3RhdGlvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmODFhMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL0VBbm5vdGF0aW9uLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9IaWRlRUFubm90YXRpb25zLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL0hpZGVFQW5ub3RhdGlvbnMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OWVkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9IaWRlRUFubm90YXRpb25zLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9IaWRlRUF0dHJpYnV0ZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvSGlkZUVBdHRyaWJ1dGVzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGI1YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvSGlkZUVBdHRyaWJ1dGVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9IaWRlRU9wZXJhdGlvbnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvSGlkZUVPcGVyYXRpb25zLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjhmZGUzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvSGlkZUVPcGVyYXRpb25zLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9IaWRlRVJlZmVyZW5jZXMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvSGlkZUVSZWZlcmVuY2VzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTg2OTFlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvSGlkZUVSZWZlcmVuY2VzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9IaWRlRVR5cGVQYXJhbWV0ZXJzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL0hpZGVFVHlwZVBhcmFtZXRlcnMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NWRmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9IaWRlRVR5cGVQYXJhbWV0ZXJzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9UaHVtYnMuZGIgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9UaHVtYnMuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljMmFkMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL1RodW1icy5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9jbGFzc19oaS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9jbGFzc19oaS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmOTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL2NsYXNzX2hpLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9lbWZhdGljLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL2VtZmF0aWMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OGI4NDQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9lbWZhdGljLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9lcnJvcl9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9lcnJvcl9jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5ZGNjYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL2Vycm9yX2NvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9sYWJlbCBkZWNvcmF0b3JzIGF0IG9yZy5lY2xpcHNlLmpkdC51aSAgaWNvbnMgZnVsbCBvdnIxNiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL2xhYmVsIGRlY29yYXRvcnMgYXQgb3JnLmVjbGlwc2UuamR0LnVpICBpY29ucyBmdWxsIG92cjE2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9sYWJlbCBkZWNvcmF0b3JzIGF0IG9yZy5lY2xpcHNlLmpkdC51aSAgaWNvbnMgZnVsbCBvdnIxNgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvbW9yZSBpY29ucyBhdCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdC50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9tb3JlIGljb25zIGF0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvbW9yZSBpY29ucyBhdCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdC50eHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3NhbXBsZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9zYW1wbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmIzYzkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy9zYW1wbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3RlbXBsYXRlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3RlbXBsYXRlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWMyNjMyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvdGVtcGxhdGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9UaHVtYnMuZGIgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy90eXBlc1ZpZXcvVGh1bWJzLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZDZhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy90eXBlc1ZpZXcvVGh1bWJzLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9hbHBoYWJfc29ydF9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy90eXBlc1ZpZXcvYWxwaGFiX3NvcnRfY28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTFjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy90eXBlc1ZpZXcvYWxwaGFiX3NvcnRfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9jbGFzc19hYnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvdHlwZXNWaWV3L2NsYXNzX2Ficy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkYjc1YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9jbGFzc19hYnMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9jbGFzc19hYnN0cmFjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy90eXBlc1ZpZXcvY2xhc3NfYWJzdHJhY3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMDNhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy90eXBlc1ZpZXcvY2xhc3NfYWJzdHJhY3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9jbGFzc19vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvdHlwZXNWaWV3L2NsYXNzX29iai5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjMmE4MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9jbGFzc19vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9kZWZpbmluZ3R5cGVfc29ydF9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy90eXBlc1ZpZXcvZGVmaW5pbmd0eXBlX3NvcnRfY28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NmVhYmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy90eXBlc1ZpZXcvZGVmaW5pbmd0eXBlX3NvcnRfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9pbmhlcl9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy90eXBlc1ZpZXcvaW5oZXJfY28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjYwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy90eXBlc1ZpZXcvaW5oZXJfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9pbnRfYWJzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9pbnRfYWJzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjRmNzNmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvdHlwZXNWaWV3L2ludF9hYnMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9pbnRfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9pbnRfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWJjNDZlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvdHlwZXNWaWV3L2ludF9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9zdWJfY28uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvdHlwZXNWaWV3L3N1Yl9jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4NzFkZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9zdWJfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3R5cGVzVmlldy9zdXBlcl9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy90eXBlc1ZpZXcvc3VwZXJfY28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YWMxMTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL0Zvckphci9pY29ucy90eXBlc1ZpZXcvc3VwZXJfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3dhcm5pbmdfY28uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9Gb3JKYXIvaWNvbnMvd2FybmluZ19jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyZGFjNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvRm9ySmFyL2ljb25zL3dhcm5pbmdfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OWEyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjggQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVQbHVnaW4ubmFtZSAoSW5jdWJhdGlvbikKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDAuMy4wLnF1YWxpZmllcgorQnVuZGxlLUNsYXNzUGF0aDogLgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuRW1mYXRpY1VJUGx1Z2luCitCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZworQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWksCisgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuYWN0aW9ucywKKyBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5lZGl0b3IKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKKyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKKyBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKKyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAorIG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUsCisgb3JnLmVjbGlwc2UudWkudmlld3MsCisgb3JnLmVjbGlwc2UudWkuaWRlLAorIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMsCisgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAorIG9yZy5lY2xpcHNlLmpkdC51aSwKKyBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLAorIG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLAorIG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS51aQorRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTJhZTkyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTUgQEAKK3NvdXJjZS4uID0gc3JjLworb3V0cHV0Li4gPSBiaW4vCitiaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIGljb25zLyxcCisgICAgICAgICAgICAgICBlbWZhdGljLXVpLmphcixcCisgICAgICAgICAgICAgICBGb3JKYXIvLFwKKyAgICAgICAgICAgICAgIHR5cGVzVmlldy8KK3NvdXJjZS5lbWZhdGljLXVpLmphciA9IHNyYy8sXAorICAgICAgICAgICAgICAgICAgICAgICAgRm9ySmFyLworCisgICAgICAgICAgICAgICAgICAgICAgICAKK291dHB1dC5lbWZhdGljLXVpLmphciA9IGJpbi8saWNvbnMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL0VBbm5vdGF0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvRUFubm90YXRpb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZjgxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL0VBbm5vdGF0aW9uLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL0hpZGVFQW5ub3RhdGlvbnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy9IaWRlRUFubm90YXRpb25zLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDllZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy9IaWRlRUFubm90YXRpb25zLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL0hpZGVFQXR0cmlidXRlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL0hpZGVFQXR0cmlidXRlcy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiNWJhNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvSGlkZUVBdHRyaWJ1dGVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL0hpZGVFT3BlcmF0aW9ucy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL0hpZGVFT3BlcmF0aW9ucy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4ZmRlMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvSGlkZUVPcGVyYXRpb25zLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL0hpZGVFUmVmZXJlbmNlcy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL0hpZGVFUmVmZXJlbmNlcy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4NjkxZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvSGlkZUVSZWZlcmVuY2VzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL0hpZGVFVHlwZVBhcmFtZXRlcnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy9IaWRlRVR5cGVQYXJhbWV0ZXJzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjVkZmNkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy9IaWRlRVR5cGVQYXJhbWV0ZXJzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL1RodW1icy5kYiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvVGh1bWJzLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzJhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL1RodW1icy5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL2NsYXNzX2hpLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvY2xhc3NfaGkuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZjkyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL2NsYXNzX2hpLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL2VtZmF0aWMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy9lbWZhdGljLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODhiODQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy9lbWZhdGljLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL2Vycm9yX2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvZXJyb3JfY28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOWRjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL2Vycm9yX2NvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL2xhYmVsIGRlY29yYXRvcnMgYXQgb3JnLmVjbGlwc2UuamR0LnVpICBpY29ucyBmdWxsIG92cjE2IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy9sYWJlbCBkZWNvcmF0b3JzIGF0IG9yZy5lY2xpcHNlLmpkdC51aSAgaWNvbnMgZnVsbCBvdnIxNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy9sYWJlbCBkZWNvcmF0b3JzIGF0IG9yZy5lY2xpcHNlLmpkdC51aSAgaWNvbnMgZnVsbCBvdnIxNgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy9tb3JlIGljb25zIGF0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0LnR4dCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvbW9yZSBpY29ucyBhdCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvbW9yZSBpY29ucyBhdCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdC50eHQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvc2FtcGxlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvc2FtcGxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGZiM2M5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy9zYW1wbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdGVtcGxhdGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy90ZW1wbGF0ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjMjYzMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdGVtcGxhdGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L1RodW1icy5kYiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L1RodW1icy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2Q2YWRlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy90eXBlc1ZpZXcvVGh1bWJzLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2FscGhhYl9zb3J0X2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2FscGhhYl9zb3J0X2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzExY2MwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy90eXBlc1ZpZXcvYWxwaGFiX3NvcnRfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2NsYXNzX2Ficy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL3R5cGVzVmlldy9jbGFzc19hYnMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZGI3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL3R5cGVzVmlldy9jbGFzc19hYnMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2NsYXNzX2Fic3RyYWN0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2NsYXNzX2Fic3RyYWN0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzAzYWUyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy90eXBlc1ZpZXcvY2xhc3NfYWJzdHJhY3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2NsYXNzX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL3R5cGVzVmlldy9jbGFzc19vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YzJhODMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL3R5cGVzVmlldy9jbGFzc19vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2RlZmluaW5ndHlwZV9zb3J0X2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2RlZmluaW5ndHlwZV9zb3J0X2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjZlYWJhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy90eXBlc1ZpZXcvZGVmaW5pbmd0eXBlX3NvcnRfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2luaGVyX2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2luaGVyX2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzI2MDAwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy90eXBlc1ZpZXcvaW5oZXJfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2ludF9hYnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy90eXBlc1ZpZXcvaW50X2Ficy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0ZjczZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2ludF9hYnMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2ludF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy90eXBlc1ZpZXcvaW50X29iai5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViYzQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L2ludF9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L3N1Yl9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL3R5cGVzVmlldy9zdWJfY28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ODcxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL3R5cGVzVmlldy9zdWJfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L3N1cGVyX2NvLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvdHlwZXNWaWV3L3N1cGVyX2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWFjMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9pY29ucy90eXBlc1ZpZXcvc3VwZXJfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvaWNvbnMvd2FybmluZ19jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL3dhcm5pbmdfY28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMmRhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL2ljb25zL3dhcm5pbmdfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZmViODcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzMgQEAKKyMvKioKKyMgKiA8Y29weXJpZ2h0PgorIyAqCisjICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAqIAorIyAqIENvbnRyaWJ1dG9yczogCisjICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgKgorIyAqIDwvY29weXJpZ2h0PgorIyAqCisjICogJElkOiBwbHVnaW4ucHJvcGVydGllcyx2IDEuMSAyMDA4LzAxLzE1IDA2OjA2OjQyIGNkYWx5IEV4cCAkCisjICovCisKKyMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAorIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1BsdWdpbi5uYW1lID0gRW1mYXRpYyBVSQorUGx1Z2luLnByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcyNjE4NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvcGx1Z2luLnhtbApAQCAtMCwwICsxLDE1OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKzxwbHVnaW4+CisKKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KKyAgICAgIDxlZGl0b3IKKyAgICAgICAgICAgIG5hbWU9IkVtZmF0aWNFZGl0b3IiCisgICAgICAgICAgICBleHRlbnNpb25zPSJlbWYiCisgICAgICAgICAgICBpY29uPSJpY29ucy9lbWZhdGljLmdpZiIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5lZGl0b3IuRW1mYXRpY0VkaXRvciIKKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvci5FbWZhdGljRWRpdG9yQWN0aW9uQ29udHJpYnV0b3IiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuZWRpdG9yLkVtZmF0aWNFZGl0b3IiPgorICAgICAgPC9lZGl0b3I+CisgICA8L2V4dGVuc2lvbj4KKyAgIAorICAgCisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+CisgICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCisgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCisgICAgICAgICAgICBuYW1lRmlsdGVyPSIqLmVtZiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5hY3Rpb25zLkdlbmVyYXRlRWNvcmUiPgorICAgICAgICAgPGFjdGlvbgorICAgICAgICAgICAgICAgbGFiZWw9IkdlbmVyYXRlIEVjb3JlIE1vZGVsIgorICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZW1mYXRpYy5naWYiCisgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuYWN0aW9ucy5HZW5lcmF0ZUVjb3JlIgorICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKKyAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCisgICAgICAgICAgICAgICBpZD0iR2VuZXJhdGVFY29yZSI+CisgICAgICAgICA8L2FjdGlvbj4KKyAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgorICAgPC9leHRlbnNpb24+CisgICAKKyAgIAorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgorICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgorICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgorICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5lY29yZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5hY3Rpb25zLkdlbmVyYXRlRW1mYXRpYyI+CisgICAgICAgICA8YWN0aW9uCisgICAgICAgICAgICAgICBsYWJlbD0iR2VuZXJhdGUgRW1mYXRpYyBTb3VyY2UiCisgICAgICAgICAgICAgICBpY29uPSJpY29ucy9lbWZhdGljLmdpZiIKKyAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5hY3Rpb25zLkdlbmVyYXRlRW1mYXRpYyIKKyAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCisgICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgorICAgICAgICAgICAgICAgaWQ9IkdlbmVyYXRlRW1mYXRpYyI+CisgICAgICAgICA8L2FjdGlvbj4KKyAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgorICAgPC9leHRlbnNpb24+CisgICAKKyAgIAorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgorICAgICAgPHdpemFyZAorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5XaXphcmQuY2F0ZWdvcnkuSUQiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkud2l6YXJkcy5FbWZhdGljTmV3V2l6YXJkIgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZW1mYXRpYy5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkud2l6YXJkcy5FbWZhdGljTmV3V2l6YXJkIgorICAgICAgICAgICAgbmFtZT0iRW1mYXRpYyBmaWxlIj4KKyAgICAgICAgIDxzZWxlY3Rpb24KKyAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgorICAgICAgICAgPC9zZWxlY3Rpb24+CisgICAgICA8L3dpemFyZD4KKyAgIDwvZXh0ZW5zaW9uPgorICAgCisgICAKKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgorICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5wcmVmZXJlbmNlcy5FbWZhdGljUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkucHJlZmVyZW5jZXMuRW1mYXRpY1ByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgbmFtZT0iRW1mYXRpYyI+CisgICAgICA8L3BhZ2U+CisgICAgICA8cGFnZQorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnByZWZlcmVuY2VzLkVtZmF0aWNQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5wcmVmZXJlbmNlcy5FbWZhdGljVGVtcGxhdGVzUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkucHJlZmVyZW5jZXMuRW1mYXRpY1RlbXBsYXRlc1ByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgbmFtZT0iVGVtcGxhdGVzIj4KKyAgICAgIDwvcGFnZT4KKyAgIDwvZXh0ZW5zaW9uPgorICAgCisgICAKKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgorICAgICAgPGluaXRpYWxpemVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIj4KKyAgICAgIDwvaW5pdGlhbGl6ZXI+CisgICA8L2V4dGVuc2lvbj4KKyAgIAorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGVtcGxhdGVzIj4KKyAgICAgIDxjb250ZXh0VHlwZQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnRlbXBsYXRlcy5FbWZhdGljQ29udGV4dFR5cGUiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkudGVtcGxhdGVzLkVtZmF0aWNDb250ZXh0VHlwZSI+CisgICAgICA8L2NvbnRleHRUeXBlPgorICAgICAgCisgICAgICA8dGVtcGxhdGUKKyAgICAgICAgY29udGV4dFR5cGVJZD0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkudGVtcGxhdGVzLkVtZmF0aWNDb250ZXh0VHlwZSIKKyAgICAgICAgaWNvbj0iaWNvbnMvdGVtcGxhdGUuZ2lmIgorICAgICAgICBkZXNjcmlwdGlvbj0iVGVtcGxhdGUgZm9yIGFuIE9DTCBpbnZhcmlhbnQiCisgICAgICAgIG5hbWU9ImludiIKKyAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnRlbXBsYXRlcy5FbWZhdGljT0NMSW52Ij4KKyAgICAgICAJPHBhdHRlcm4+CitAImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb2NsL2V4YW1wbGVzL09DTCIoJHtpbnZOYW1lfT0iICR7Ym9vbGVhbkV4cHJlc3Npb259ICIpCisgICAgICAgIDwvcGF0dGVybj4KKyAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgIAorICAgICAgPHRlbXBsYXRlCisgICAgICAgIGNvbnRleHRUeXBlSWQ9Im9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnRlbXBsYXRlcy5FbWZhdGljQ29udGV4dFR5cGUiCisgICAgICAgIGljb249Imljb25zL3RlbXBsYXRlLmdpZiIKKyAgICAgICAgZGVzY3JpcHRpb249IlRlbXBsYXRlIGZvciBhbiBPQ0wgZGVyaXZlIgorICAgICAgICBuYW1lPSJkZXIiCisgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS50ZW1wbGF0ZXMuRW1mYXRpY09DTERlciI+CisgICAgICAgCTxwYXR0ZXJuPgorQCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29jbC9leGFtcGxlcy9PQ0wiKGRlcml2ZT0iICR7Y3Vyc29yfSAiKQorICAgICAgICA8L3BhdHRlcm4+CisgICAgICAgIDwvdGVtcGxhdGU+CisKKyAgICAgIDx0ZW1wbGF0ZQorICAgICAgICBjb250ZXh0VHlwZUlkPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS50ZW1wbGF0ZXMuRW1mYXRpY0NvbnRleHRUeXBlIgorICAgICAgICBpY29uPSJpY29ucy90ZW1wbGF0ZS5naWYiCisgICAgICAgIGRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBmb3IgYW4gT0NMIGJvZHkiCisgICAgICAgIG5hbWU9ImJvZHkiCisgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS50ZW1wbGF0ZXMuRW1mYXRpY09DTEJvZHkiPgorICAgICAgIAk8cGF0dGVybj4KK0AiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vY2wvZXhhbXBsZXMvT0NMIihib2R5PSIgJHtjdXJzb3J9ICIpCisgICAgICAgIDwvcGF0dGVybj4KKyAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgCisgIDwvZXh0ZW5zaW9uPgorICAKKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+CisgICAgICA8Y2F0ZWdvcnkKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYyIKKyAgICAgICAgICAgIG5hbWU9IkVtZmF0aWMiPgorICAgICAgPC9jYXRlZ29yeT4KKyAgICAgIDx2aWV3CisgICAgICAgICAgICBhbGxvd011bHRpcGxlPSJmYWxzZSIKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS52aWV3cy5UeXBlc1ZpZXciCisgICAgICAgICAgICBpY29uPSJpY29ucy9jbGFzc19oaS5naWYiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkudmlld3MuVHlwZXNWaWV3IgorICAgICAgICAgICAgbmFtZT0iRU1GIFR5cGUgSGllcmFyY2h5Ij4KKyAgICAgIDwvdmlldz4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+CisgICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KKyAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIj4KKyAgICAgICAgIDxzaG93SW5QYXJ0CisgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkudmlld3MuVHlwZXNWaWV3Ij4KKyAgICAgICAgIDwvc2hvd0luUGFydD4KKyAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+CisgICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9FbWZhdGljVUlQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL0VtZmF0aWNVSVBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ODY3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9FbWZhdGljVUlQbHVnaW4uamF2YQpAQCAtMCwwICsxLDIzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkucmVkc3F1aWdnbGVzLkVtZmF0aWNSZWRTcXVpZ2dsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkudGVtcGxhdGVzLkVtZmF0aWNDb250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25UZW1wbGF0ZVN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisKKy8qKgorICogCisgKiBAYXV0aG9yIG1pZ3VlbC5nYXJjaWFAdHVoaC5kZQorICovCitwdWJsaWMgY2xhc3MgRW1mYXRpY1VJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisKKwlwdWJsaWMgRW1mYXRpY1VJUGx1Z2luKCkgeworCQlwbHVnaW4gPSB0aGlzOworCQl0cnkgeworCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLkVtZmF0aWNVSVBsdWdpblJlc291cmNlcyIpOworCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gX2V4KSB7CisJCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7CisJCX0KKworCQlyZWRTcXVpZ2dsZXIgPSBuZXcgRW1mYXRpY1JlZFNxdWlnZ2xlcigpOworCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZWRTcXVpZ2dsZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKKwkJLy8gVE9ETyB1c2UgSVdvcmtzcGFjZS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIG9uIHBsdWdpbiBzaHV0ZG93bgorCX0KKworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCX0KKworCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVtZmF0aWNVSVBsdWdpbiBnZXREZWZhdWx0KCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7CisJCXRyeSB7CisJCQlyZXR1cm4gYnVuZGxlID09IG51bGwgPyBrZXkgOiBidW5kbGUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBfZXgpIHsKKwkJCXJldHVybiBrZXk7CisJCX0KKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7CisJCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoaXMgcGx1Z2luJ3MgdGVtcGxhdGUgc3RvcmUuCisJICogCisJICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgb2YgdGhpcyBwbHVnLWluIGluc3RhbmNlCisJICovCisJcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0RW1mYXRpY1RlbXBsYXRlU3RvcmUoKSB7CisJCWlmIChlbWZhdGljVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7CisJCQllbWZhdGljVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldEVtZmF0aWNDb250ZXh0VHlwZVJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLAorCQkJCQlDVVNUT01fVEVNUExBVEVTX0VNRkFUSUNfS0VZKTsKKwkJCXRyeSB7CisJCQkJZW1mYXRpY1RlbXBsYXRlU3RvcmUubG9hZCgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJRW1mYXRpY1VJUGx1Z2luLmxvZygiTG9hZGluZyBFbWZhdGljIHRlbXBsYXRlIHN0b3JlIiwgZSk7CisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVtZmF0aWNUZW1wbGF0ZVN0b3JlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhpcyBwbHVnaW4ncyBMYVRlWCBjb250ZXh0IHR5cGUgcmVnaXN0cnkuCisJICogCisJICogQHJldHVybiB0aGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWctaW4gaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRFbWZhdGljQ29udGV4dFR5cGVSZWdpc3RyeSgpIHsKKwkJaWYgKGVtZmF0aWNUeXBlUmVnaXN0cnkgPT0gbnVsbCkgeworCQkJLy8gY3JlYXRlIGFuIGNvbmZpZ3VyZSB0aGUgY29udGV4dHMgYXZhaWxhYmxlIGluIHRoZSB0ZW1wbGF0ZSBlZGl0b3IKKwkJCWVtZmF0aWNUeXBlUmVnaXN0cnkgPSBuZXcgQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSgpOworCQkJZW1mYXRpY1R5cGVSZWdpc3RyeS5hZGRDb250ZXh0VHlwZShuZXcgRW1mYXRpY0NvbnRleHRUeXBlKCkpOworCQl9CisJCXJldHVybiBlbWZhdGljVHlwZVJlZ2lzdHJ5OworCX0KKworCS8qKgorCSAqIERpc3BsYXkgYSBtZXNzYWdlIGluIHRoZSBFY2xpcHNlJ3MgRXJyb3IgTG9nLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKwkgKiBjYWxsaW5nIDxjb2RlPmxvZyhtc2csIHQsIElTdGF0dXMuRVJST1IpPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gbXNnCisJICogICAgICAgICAgICBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gZXJyb3IgbG9nCisJICogQHBhcmFtIHQKKwkgKiAgICAgICAgICAgIGV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZywgVGhyb3dhYmxlIHQpIHsKKwkJbG9nKG1zZywgdCwgSVN0YXR1cy5FUlJPUik7CisJfQorCisJLyoqCisJICogRGlzcGxheSBhIG1lc3NhZ2UgaW4gdGhlIEVjbGlwc2UncyBFcnJvciBMb2cuIFVzZWQgYnkgZS5nLiB0aGUgcHJvamVjdAorCSAqIGNyZWF0aW9uIHdpemFyZC4KKwkgKiAKKwkgKiBAcGFyYW0gbXNnCisJICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCisJICogQHBhcmFtIHQKKwkgKiAgICAgICAgICAgIGV4Y2VwdGlvbgorCSAqIEBwYXJhbSBsZXZlbAorCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBlcnJvciBsZXZlbHMgZGVmaW5lZCBpbiB0aGUgPGNvZGU+SVN0YXR1czwvY29kZT4KKwkgKiAgICAgICAgICAgIC1pbnRlcmZhY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2csIFRocm93YWJsZSB0LCBpbnQgbGV2ZWwpIHsKKwkJSVN0YXR1cyBzdGF0ID0gbmV3IFN0YXR1cyhsZXZlbCwgZ2V0UGx1Z2luSWQoKSwgbGV2ZWwsIG1zZywgdCk7CisJCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luLgorCSAqIAorCSAqIFVzZWQgYnkgcHJvamVjdCBjcmVhdGlvbiB3aXphcmQuCisJICogCisJICogQHJldHVybiB1bmlxdWUgaWQgb2YgdGhpcyBwbHVnaW4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKKwkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYW4gaW1hZ2UgZnJvbSB0aGUgcGx1Z2luJ3MgaWNvbnMtZGlyZWN0b3J5LgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBpY29uCisJICogQHJldHVybiB0aGUgaWNvbiBhcyBhbiBpbWFnZSBvYmplY3QKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0Q2FjaGVkSW1hZ2UobmFtZSk7CisJfQorCisJLyoqCisJICogQ2FjaGUgdGhlIGltYWdlIGlmIGl0IGlzIGZvdW5kLgorCSAqIAorCSAqIEBwYXJhbSBrZXkKKwkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGltYWdlCisJICogQHJldHVybiBpbWFnZSBmcm9tIHRoZSBjYWNoZSBvciBmcm9tIGRpc2ssIG51bGwgaWYgaW1hZ2UgaXMgbm90IGZvdW5kIGluCisJICogICAgICAgICBlaXRoZXIKKwkgKi8KKwlwcm90ZWN0ZWQgSW1hZ2UgZ2V0Q2FjaGVkSW1hZ2UoU3RyaW5nIGtleSkgeworCQlpZiAoa2V5ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJSW1hZ2UgZyA9IChJbWFnZSkgaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKKwkJaWYgKGcgIT0gbnVsbCkgeworCQkJcmV0dXJuIGc7CisJCX0KKworCQlJbWFnZURlc2NyaXB0b3IgZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdldEJ1bmRsZSgpLmdldEVudHJ5KCJpY29ucy8iICsga2V5ICsgIi5naWYiKSk7CisJCWlmIChkID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJLy8gd2Ugd2FudCBudWxsIGluc3RlYWQgb2YgZGVmYXVsdCBtaXNzaW5nIGltYWdlCisJCWlmIChkLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlnID0gZC5jcmVhdGVJbWFnZSgpOworCQlpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGcpOworCQlyZXR1cm4gZzsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gaW1hZ2UgKGZyb20gZWNsaXBzZSBoZWxwKQorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICBOYW1lIG9mIHRoZSBpYW1nZQorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgaW1hZ2UgZGVzY3JpcHRvciBvcgorCSAqICAgICAgICAgPGNvZGU+TWlzc2luZ0ltYWdlRGVzY3JpcHRvcjwvY29kZT4gaWYgbm9uZSBpcyBmb3VuZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgaWNvblBhdGggPSAiaWNvbnMvIjsKKwkJdHJ5IHsKKwkJCVVSTCBpbnN0YWxsVVJMID0gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7CisJCQlVUkwgdXJsID0gbmV3IFVSTChpbnN0YWxsVVJMLCBpY29uUGF0aCArIG5hbWUgKyAiLmdpZiIpOworCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBzaG91bGQgbm90IGhhcHBlbgorCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBFbWZhdGljVUlQbHVnaW4gcGx1Z2luOworCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7CisJcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZWRTcXVpZ2dsZXI7CisJcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGVtZmF0aWNUZW1wbGF0ZVN0b3JlOworCXByaXZhdGUgQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSBlbWZhdGljVHlwZVJlZ2lzdHJ5ID0gbnVsbDsKKworCS8vIEtleSB0byBzdG9yZSBjdXN0b20gdGVtcGxhdGVzLgorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVEVNUExBVEVTX0VNRkFUSUNfS0VZID0gIkVtZmF0aWNUZW1wbGF0ZXMiOworCisJLy8gY2FjaGUgZm9yIGljb25zCisJcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgSW1hZ2U+IGltYWdlUmVnaXN0cnkgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltYWdlPigpOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvYWN0aW9ucy9HZW5lcmF0ZUVjb3JlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9hY3Rpb25zL0dlbmVyYXRlRWNvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNlMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvYWN0aW9ucy9HZW5lcmF0ZUVjb3JlLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmFjdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lY29yZS5FY29yZUdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CisKKworLyoqCisgKiAKKyAqIEBhdXRob3IgY2pkYWx5QHVzLmlibS5jb20KKyAqLworcHVibGljIGNsYXNzIEdlbmVyYXRlRWNvcmUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgeworCQorCXByaXZhdGUgSUZpbGUgX2ZpbGU7CisJcHJpdmF0ZSBHZW5lcmF0ZUVjb3JlSm9iIF9qb2I7CisKKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7CisJfQorCQorCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCV9maWxlID0gbnVsbDsKKwkJCisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKKwkJCU9iamVjdCBzZWxFbGVtID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOworCQkJaWYgKHNlbEVsZW0gaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJCV9maWxlID0gKElGaWxlKXNlbEVsZW07CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKKwkJaWYgKChfZmlsZSAhPSBudWxsKSAmJiAoX2pvYiA9PSBudWxsKSkgeworCQkJX2pvYiA9IG5ldyBHZW5lcmF0ZUVjb3JlSm9iKCk7CisJCQlfam9iLnNjaGVkdWxlKCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBjbGFzcyBHZW5lcmF0ZUVjb3JlSm9iIGV4dGVuZHMgSm9iIHsKKwkJcHJpdmF0ZSBHZW5lcmF0ZUVjb3JlSm9iKCkgeworCQkJc3VwZXIoIkdlbmVyYXRpbmcgRWNvcmUgTW9kZWwgZm9yICIgKyBfZmlsZS5nZXROYW1lKCkpOworCQl9CisJCQorCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisKKwkJICAgIEVjb3JlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBFY29yZUdlbmVyYXRvcigpOworCQkJZ2VuZXJhdG9yLmdlbmVyYXRlKF9maWxlLCBtb25pdG9yKTsKKwkJCQorCQkJX2pvYiA9IG51bGw7CisJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJfQorCX0KKwkKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2FjdGlvbnMvR2VuZXJhdGVFbWZhdGljLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9hY3Rpb25zL0dlbmVyYXRlRW1mYXRpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNjVhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9hY3Rpb25zL0dlbmVyYXRlRW1mYXRpYy5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuYWN0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRGlhZ25vc3RpY2lhbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lbWZhdGljLkVtZmF0aWNHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OworCitwdWJsaWMgY2xhc3MgR2VuZXJhdGVFbWZhdGljIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKKwlwcml2YXRlIGNsYXNzIEdlbmVyYXRlRW1mYXRpY0pvYiBleHRlbmRzIEpvYiB7CisKKwkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCisJCQlib29sZWFuIG9rID0gZWNvcmVWYWxpZGF0ZShfZmlsZSwgbW9uaXRvcik7CisJCQlpZiAob2spIHsKKwkJCQlFbWZhdGljR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBFbWZhdGljR2VuZXJhdG9yKCk7CisJCQkJZ2VuZXJhdG9yLmdlbmVyYXRlKF9maWxlLCBtb25pdG9yKTsKKwkJCX0KKwkJCV9qb2IgPSBudWxsOworCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCX0KKworCQlHZW5lcmF0ZUVtZmF0aWNKb2IoKSB7CisJCQlzdXBlcigiR2VuZXJhdGluZyBFbWZhdGljIFNvdXJjZSBmb3IgIiArIF9maWxlLmdldE5hbWUoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgR2VuZXJhdGVFbWZhdGljKCkgeworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBpYWN0aW9uLCBJV29ya2JlbmNoUGFydCBpd29ya2JlbmNocGFydCkgeworCX0KKworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCV9maWxlID0gbnVsbDsKKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKKwkJCU9iamVjdCBzZWxFbGVtID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOworCQkJaWYgKHNlbEVsZW0gaW5zdGFuY2VvZiBJRmlsZSkKKwkJCQlfZmlsZSA9IChJRmlsZSkgc2VsRWxlbTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgeworCQlpZiAoX2ZpbGUgIT0gbnVsbCAmJiBfam9iID09IG51bGwpIHsKKwkJCV9qb2IgPSBuZXcgR2VuZXJhdGVFbWZhdGljSm9iKCk7CisJCQlfam9iLnNjaGVkdWxlKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIElGaWxlIF9maWxlOworCXByaXZhdGUgR2VuZXJhdGVFbWZhdGljSm9iIF9qb2I7CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWNvcmVWYWxpZGF0ZShJRmlsZSBlY29yZUZpbGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7CisJCVN0cmluZyBlY29yZUZpbGVQYXRoID0gZWNvcmVGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKKwkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGVjb3JlRmlsZVBhdGgpOworCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKKwkJUmVzb3VyY2UgZWNvcmVSZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7CisJCWlmIChlY29yZUZpbGUgIT0gbnVsbCkgeworCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygiZWNvcmVWYWxpZGF0aW5nIC4uLiIsIDEpOworCQkJRU9iamVjdCByb290UGFja2FnZSA9IGVjb3JlUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7CisJCQlEaWFnbm9zdGljaWFuIGRpYWdub3N0aWNpYW4gPSBuZXcgRGlhZ25vc3RpY2lhbigpOworCQkJZmluYWwgRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gZGlhZ25vc3RpY2lhbi52YWxpZGF0ZShyb290UGFja2FnZSk7CisJCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOworCQkJLy8gZGlzcGxheSBhcyBtYXJrZXJzCisJCQlpZiAocHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJCWhhbmRsZURpYWdub3N0aWMoZWNvcmVGaWxlLCBEaWFnbm9zdGljLkNBTkNFTF9JTlNUQU5DRSk7CisJCQl9IGVsc2UgeworCQkJCWhhbmRsZURpYWdub3N0aWMoZWNvcmVGaWxlLCBkaWFnbm9zdGljKTsKKwkJCX0KKwkJCWJvb2xlYW4gcmVzID0gZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpIDwgRGlhZ25vc3RpYy5FUlJPUjsKKwkJCXJldHVybiByZXM7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlRGlhZ25vc3RpYyhJRmlsZSBlY29yZUZpbGUsIERpYWdub3N0aWMgZGlhZ25vc3RpYykgeworCisJCWludCBzZXZlcml0eSA9IGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKTsKKwkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSA9PSBEaWFnbm9zdGljLk9LKSB7CisJCQkvLyBUT0RPIG5vIGVycm9yCisJCX0KKworCQlkZWxldGVNYXJrZXJzKGVjb3JlRmlsZSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKKwkJZm9yIChEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA6IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKSkgeworCQkJdHJ5IHsKKwkJCQljcmVhdGVNYXJrZXJzKGVjb3JlRmlsZSwgY2hpbGREaWFnbm9zdGljLCBudWxsKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBEaWFnbm9zdGljIGRpYWdub3N0aWMsIERpYWdub3N0aWMgcGFyZW50RGlhZ25vc3RpYykKKwkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKKwkJCUlNYXJrZXIgbWFya2VyID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKGdldE1hcmtlcklEKCkpOworCQkJaW50IHNldmVyaXR5ID0gZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpOworCQkJaWYgKHNldmVyaXR5IDwgRGlhZ25vc3RpYy5XQVJOSU5HKSB7CisJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0lORk8pOworCQkJfSBlbHNlIGlmIChzZXZlcml0eSA8IERpYWdub3N0aWMuRVJST1IpIHsKKwkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyk7CisJCQl9IGVsc2UgeworCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7CisJCQl9CisKKwkJCVN0cmluZyBtZXNzYWdlID0gZGlhZ25vc3RpYy5nZXRNZXNzYWdlKCk7CisJCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7CisJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIG1lc3NhZ2UpOworCQkJfQorCisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRNYXJrZXJJRCgpIHsKKwkJcmV0dXJuICJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIjsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGVsZXRlTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gaW5jbHVkZVN1YnR5cGVzLCBpbnQgZGVwdGgpIHsKKwkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKKwkJCXRyeSB7CisJCQkJcmVzb3VyY2UuZGVsZXRlTWFya2VycyhnZXRNYXJrZXJJRCgpLCBpbmNsdWRlU3VidHlwZXMsIGRlcHRoKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9jb250ZW50YXNzaXN0L0Nhc2NhZGVkQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvY29udGVudGFzc2lzdC9DYXNjYWRlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjljZTVjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvY29udGVudGFzc2lzdC9DYXNjYWRlZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5jb250ZW50YXNzaXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOworCitwdWJsaWMgY2xhc3MgQ2FzY2FkZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgeworCisJcHJpdmF0ZSBQcm9wb3NhbHNDb21wYXJhdG9yIHByb3Bvc2Fsc0NvbXBhcmF0b3IgPSBuZXcgUHJvcG9zYWxzQ29tcGFyYXRvcigpOworCisJcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsCisJCQlpbnQgb2Zmc2V0KSB7CisJCUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gcmVzID0gbmV3IEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPigpOworCQlmb3IgKElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGNhcCA6IGNhcHMpIHsKKwkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBvbmVDYXAgPSBjYXAuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoCisJCQkJCXZpZXdlciwgb2Zmc2V0KTsKKwkJCWlmIChvbmVDYXAgIT0gbnVsbCkgeworCQkJCWZvciAoSUNvbXBsZXRpb25Qcm9wb3NhbCBjcCA6IG9uZUNhcCkgeworCQkJCQlpZiAoIXJlcy5jb250YWlucyhjcCkpIHsKKwkJCQkJCXJlcy5hZGQoY3ApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXMyID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcmVzLnNpemUoKV07CisJCXJlcy50b0FycmF5KHJlczIpOworCQkvLyBBcnJheXMuc29ydChyZXMyLCBwcm9wb3NhbHNDb21wYXJhdG9yKTsKKwkJcmV0dXJuIHJlczI7CisJfQorCisJcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwKKwkJCWludCBvZmZzZXQpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7CisJCUxpc3Q8Q2hhcmFjdGVyPiByZXMgPSBuZXcgQXJyYXlMaXN0PENoYXJhY3Rlcj4oKTsKKwkJZm9yIChJQ29udGVudEFzc2lzdFByb2Nlc3NvciBjYXAgOiBjYXBzKSB7CisJCQljaGFyW10gY2FwQWN0ID0gY2FwLmdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpOworCQkJZm9yIChjaGFyIGMgOiBjYXBBY3QpIHsKKwkJCQlpZiAoIXJlcy5jb250YWlucyhjKSkgeworCQkJCQlyZXMuYWRkKGMpOworCQkJCX0KKwkJCX0KKwkJfQorCQljaGFyW10gcmVzMiA9IG5ldyBjaGFyW3Jlcy5zaXplKCldOworCQlpbnQgaSA9IDA7CisJCWZvciAoQ2hhcmFjdGVyIGMgOiByZXMpIHsKKwkJCXJlczJbaV0gPSBjOworCQkJaSsrOworCQl9CisJCXJldHVybiByZXMyOworCX0KKworCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlMaXN0PElDb250ZW50QXNzaXN0UHJvY2Vzc29yPiBjYXBzID0gbmV3IEFycmF5TGlzdDxJQ29udGVudEFzc2lzdFByb2Nlc3Nvcj4oKTsKKworCXB1YmxpYyB2b2lkIGFkZChJQ29udGVudEFzc2lzdFByb2Nlc3NvciBjYXApIHsKKwkJY2Fwcy5hZGQoY2FwKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2NvbnRlbnRhc3Npc3QvRW1mYXRpY0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2NvbnRlbnRhc3Npc3QvRW1mYXRpY0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQ2ODMyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvY29udGVudGFzc2lzdC9FbWZhdGljQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmNvbnRlbnRhc3Npc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5FbWZhdGljQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5lZGl0b3IuRW1mYXRpY0VkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciB7CisKKwlwcml2YXRlIEVtZmF0aWNFZGl0b3IgX2VkaXRvciA9IG51bGw7CisJcHJpdmF0ZSBQcm9wb3NhbHNDb21wYXJhdG9yIHByb3Bvc2Fsc0NvbXBhcmF0b3IgPSBuZXcgUHJvcG9zYWxzQ29tcGFyYXRvcigpOworCisJcHVibGljIEVtZmF0aWNDb250ZW50QXNzaXN0UHJvY2Vzc29yKEVtZmF0aWNFZGl0b3IgZWRpdG9yKSB7CisJCV9lZGl0b3IgPSBlZGl0b3I7CisJfQorCisJcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsCisJCQlpbnQgb2Zmc2V0KSB7CisKKwkJQVNUTm9kZSBub2RlQXRDdXJzb3IgPSBfZWRpdG9yLmdldE5vZGVBdEN1cnNvcigpOworCQlpZiAobm9kZUF0Q3Vyc29yID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOyAgIAorCQl9CisJCUFTVE5vZGUgbm9kZSA9IF9lZGl0b3IuZ2V0Q2xvc2VzdEVuY2xvc2luZ0FTVE5vZGVBdChub2RlQXRDdXJzb3IuZ2V0UmFuZ2VTdGFydCgpLCBFbWZhdGljQVNUTm9kZS5jbGFzcyk7IAorCQlTdHJpbmcgd29yZCA9IG5vZGUuZ2V0VGV4dCgpOworCisJCUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gcmV0dXJuUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPigpOworCQkKKwkJSUNvbXBsZXRpb25Qcm9wb3NhbCBsb25lbHkgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsKAkKKwkJCQl3b3JkLAkJCQkJLy9yZXBsYWNlbWVudFN0cmluZworCQkJCW5vZGUuZ2V0UmFuZ2VTdGFydCgpLCAJLy9yZXBsYWNlbWVudE9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSB0ZXh0IHRvIGJlIHJlcGxhY2VkCisJCQkJbm9kZS5nZXRSYW5nZUxlbmd0aCgpLAkvL3JlcGxhY2VtZW50TGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgdG8gYmUgcmVwbGFjZWQKKwkJCQl3b3JkLmxlbmd0aCgpLAkvL2N1cnNvclBvc2l0aW9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIGZvbGxvd2luZyB0aGUgaW5zZXJ0IHJlbGF0aXZlIHRvIHJlcGxhY2VtZW50T2Zmc2V0CisJCQkJbnVsbCwgCQkJLy9pbWFnZSB0byBkaXNwbGF5CisJCQkJd29yZCwgCQkJLy9kaXNwbGF5U3RyaW5nIHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkIGZvciB0aGUgcHJvcG9zYWwKKwkJCQludWxsLAkJCS8vY29udGVudEluZm9ybWF0aW9uIHRoZSBjb250ZXh0IGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb3Bvc2FsCisJCQkJIiIgKTsJCQkvL2FkZGl0aW9uYWwgcHJvcG9zYWwgaW5mbworCQlyZXR1cm5Qcm9wb3NhbHMuYWRkKGxvbmVseSk7CisJCQorCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcmV0dXJuUHJvcG9zYWxzCisJCQkJLnNpemUoKV07CisJCXJldHVyblByb3Bvc2Fscy50b0FycmF5KHByb3Bvc2Fscyk7CisKKwkJQXJyYXlzLnNvcnQocHJvcG9zYWxzLCBwcm9wb3NhbHNDb21wYXJhdG9yKTsKKwkJcmV0dXJuIHByb3Bvc2FsczsKKwl9CisKKwlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLAorCQkJaW50IG9mZnNldCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKKwkJcmV0dXJuIG5ldyBjaGFyW10geyAgfTsKKwl9CisKKwlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9jb250ZW50YXNzaXN0L0VtZmF0aWNLZXl3b3JkQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvY29udGVudGFzc2lzdC9FbWZhdGljS2V5d29yZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RkMDJjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvY29udGVudGFzc2lzdC9FbWZhdGljS2V5d29yZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuY29udGVudGFzc2lzdDsKKworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS51dGlsLkVtZmF0aWNLZXl3b3JkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5lZGl0b3IuRW1mYXRpY0VkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRleHRJbmZvcm1hdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7CisKK3B1YmxpYyBjbGFzcyBFbWZhdGljS2V5d29yZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaW1wbGVtZW50cworCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciB7CisKKwlwcml2YXRlIEVtZmF0aWNFZGl0b3IgX2VkaXRvciA9IG51bGw7CisJcHJpdmF0ZSBUcmVlU2V0PFN0cmluZz4gcHJvcG9zYWxMaXN0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworCXByaXZhdGUgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBmVmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcigpOworCisJcHVibGljIEVtZmF0aWNLZXl3b3JkQ29udGVudEFzc2lzdFByb2Nlc3NvcihFbWZhdGljRWRpdG9yIGVkaXRvcikgeworCQlfZWRpdG9yID0gZWRpdG9yOworCX0KKworCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLAorCQkJaW50IG9mZnNldCkgeworCQkKKwkJdHJ5IHsKKwkJCWlmICh2aWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXRDaGFyKG9mZnNldCAtIDEpID09ICdAJykgeworCQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHt9OworCQkJfQorCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KKworCQlXb3JkUGFydERldGVjdG9yIHdwZCA9IG5ldyBXb3JkUGFydERldGVjdG9yKHZpZXdlciwgb2Zmc2V0KTsKKwkJU3RyaW5nIHN0YXJ0ID0gd3BkLndvcmRQYXJ0OworCQlwcm9wb3NhbExpc3QgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7CisJCWZvciAoU3RyaW5nIGt3IDogRW1mYXRpY0tleXdvcmRzLkdldEtleXdvcmRzKCkpIHsKKwkJCWlmIChrdy5zdGFydHNXaXRoKHN0YXJ0KSkgeworCQkJCXByb3Bvc2FsTGlzdC5hZGQoa3cpOworCQkJfQorCQl9CisJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXMgPSB0dXJuUHJvcG9zYWxWZWN0b3JJbnRvQWRhcHRlZEFycmF5KHdwZCk7CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwKKwkJCWludCBvZmZzZXQpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKKwkJcmV0dXJuIG5ldyBjaGFyW10ge307CisJfQorCisJcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgeworCQlyZXR1cm4gZlZhbGlkYXRvcjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIFR1cm5zIHRoZSB2ZWN0b3IgaW50byBhbiBBcnJheSBvZiBJQ29tcGxldGlvblByb3Bvc2FsIG9iamVjdHMKKwkgKi8KKwlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHR1cm5Qcm9wb3NhbFZlY3RvckludG9BZGFwdGVkQXJyYXkoCisJCQlXb3JkUGFydERldGVjdG9yIHdvcmQpIHsKKwkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlc3VsdCA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2FsTGlzdAorCQkJCS5zaXplKCldOworCisJCWludCBpbmRleCA9IDA7CisKKwkJZm9yIChTdHJpbmcga2V5V29yZCA6IHByb3Bvc2FsTGlzdCkgeworCisJCQlJQ29udGV4dEluZm9ybWF0aW9uIGluZm8gPSBuZXcgQ29udGV4dEluZm9ybWF0aW9uKGtleVdvcmQsCisJCQkJCWdldENvbnRlbnRJbmZvU3RyaW5nKGtleVdvcmQpKTsKKwkJCS8vIENyZWF0ZXMgYSBuZXcgY29tcGxldGlvbiBwcm9wb3NhbC4KKwkJCXJlc3VsdFtpbmRleF0gPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsKGtleVdvcmQsIC8vIHJlcGxhY2VtZW50U3RyaW5nCisJCQkJCXdvcmQuZ2V0T2Zmc2V0KCksIC8vIHJlcGxhY2VtZW50T2Zmc2V0IHRoZSBvZmZzZXQgb2YgdGhlCisJCQkJCS8vIHRleHQgdG8gYmUgcmVwbGFjZWQKKwkJCQkJd29yZC5nZXRMZW5ndGgoKSwgLy8gcmVwbGFjZW1lbnRMZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUKKwkJCQkJLy8gdGV4dCB0byBiZSByZXBsYWNlZAorCQkJCQlrZXlXb3JkLmxlbmd0aCgpLCAvLyBjdXJzb3JQb3NpdGlvbiB0aGUgcG9zaXRpb24gb2YgdGhlCisJCQkJCS8vIGN1cnNvciBmb2xsb3dpbmcgdGhlIGluc2VydCByZWxhdGl2ZQorCQkJCQkvLyB0byByZXBsYWNlbWVudE9mZnNldAorCQkJCQludWxsLCAvLyBpbWFnZSB0byBkaXNwbGF5CisJCQkJCWtleVdvcmQsIC8vIGRpc3BsYXlTdHJpbmcgdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQgZm9yCisJCQkJCS8vIHRoZSBwcm9wb3NhbAorCQkJCQludWxsLCAvLyBjb250ZW50SW5mb3JtYXRpb24gdGhlIGNvbnRleHQgaW5mb3JtYXRpb24KKwkJCQkJLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvcG9zYWwKKwkJCQkJZ2V0Q29udGVudEluZm9TdHJpbmcoa2V5V29yZCkpOworCQkJaW5kZXgrKzsKKwkJfQorCQlwcm9wb3NhbExpc3QuY2xlYXIoKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBNZXRob2QgZ2V0Q29udGVudEluZm9TdHJpbmcuCisJICogCisJICogQHBhcmFtIGtleVdvcmQKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBnZXRDb250ZW50SW5mb1N0cmluZyhTdHJpbmcga2V5V29yZCkgeworCQlyZXR1cm4gIiI7CisJfQorCisJLyoqCisJICogU2ltcGxlIGNvbnRlbnQgYXNzaXN0IHRpcCBjbG9zZXIuIFRoZSB0aXAgaXMgdmFsaWQgaW4gYSByYW5nZSBvZiA1CisJICogY2hhcmFjdGVycyBhcm91bmQgaXRzIHBvcHVwIGxvY2F0aW9uLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVmFsaWRhdG9yIGltcGxlbWVudHMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciwKKwkJCUlDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIgeworCisJCXByb3RlY3RlZCBpbnQgZkluc3RhbGxPZmZzZXQ7CisKKwkJLyoKKwkJICogQHNlZSBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yI2lzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoaW50KQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNDb250ZXh0SW5mb3JtYXRpb25WYWxpZChpbnQgb2Zmc2V0KSB7CisJCQlyZXR1cm4gTWF0aC5hYnMoZkluc3RhbGxPZmZzZXQgLSBvZmZzZXQpIDwgNTsKKwkJfQorCisJCS8qCisJCSAqIEBzZWUgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciNpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24sCisJCSAqICAgICAgSVRleHRWaWV3ZXIsIGludCkKKwkJICovCisJCXB1YmxpYyB2b2lkIGluc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvLCBJVGV4dFZpZXdlciB2aWV3ZXIsCisJCQkJaW50IG9mZnNldCkgeworCQkJZkluc3RhbGxPZmZzZXQgPSBvZmZzZXQ7CisJCX0KKworCQkvKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyI3VwZGF0ZVByZXNlbnRhdGlvbihpbnQsCisJCSAqICAgICAgVGV4dFByZXNlbnRhdGlvbikKKwkJICovCisJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVByZXNlbnRhdGlvbihpbnQgZG9jdW1lbnRQb3NpdGlvbiwKKwkJCQlUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfTsKKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvY29udGVudGFzc2lzdC9Qcm9wb3NhbHNDb21wYXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9jb250ZW50YXNzaXN0L1Byb3Bvc2Fsc0NvbXBhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzlhOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvY29udGVudGFzc2lzdC9Qcm9wb3NhbHNDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuY29udGVudGFzc2lzdDsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7CisKK3B1YmxpYyBjbGFzcyBQcm9wb3NhbHNDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxJQ29tcGxldGlvblByb3Bvc2FsPiB7CisgICAgCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdHdvIElDb21wbGV0aW9uUHJvcG9zYWxzIGFjY29yZGluZyB0byB0aGVpciBkaXNwbGF5IFN0cmluZ3MKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHNhbWUgYXMgU3RyaW5nLmNvbXBhcmVUb0lnbm9yZUNhc2UoKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29tcGFyZShJQ29tcGxldGlvblByb3Bvc2FsIHAxLCBJQ29tcGxldGlvblByb3Bvc2FsIHAyKSB7CisgICAgICAgIHJldHVybiBwMS5nZXREaXNwbGF5U3RyaW5nKCkuY29tcGFyZVRvSWdub3JlQ2FzZShwMi5nZXREaXNwbGF5U3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2NvbnRlbnRhc3Npc3QvV29yZFBhcnREZXRlY3Rvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvY29udGVudGFzc2lzdC9Xb3JkUGFydERldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjMTA0MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2NvbnRlbnRhc3Npc3QvV29yZFBhcnREZXRlY3Rvci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmNvbnRlbnRhc3Npc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7CisKK3B1YmxpYyBjbGFzcyBXb3JkUGFydERldGVjdG9yIHsKKwlTdHJpbmcgd29yZFBhcnQgPSAiIjsKKwlpbnQgZG9jT2Zmc2V0OworCisJLyoqCisJICogTWV0aG9kIFdvcmRQYXJ0RGV0ZWN0b3IuCisJICogCisJICogQHBhcmFtIHZpZXdlcgorCSAqICAgICAgICAgICAgaXMgYSB0ZXh0IHZpZXdlcgorCSAqIEBwYXJhbSBkb2N1bWVudE9mZnNldAorCSAqICAgICAgICAgICAgaW50byB0aGUgU1FMIGRvY3VtZW50CisJICovCisJcHVibGljIFdvcmRQYXJ0RGV0ZWN0b3IoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKKwkJZG9jT2Zmc2V0ID0gZG9jdW1lbnRPZmZzZXQgLSAxOworCQl0cnkgeworCQkJLy8gZmluZCB0aGUgd29yZCB0aGF0IG11c3QgYmUgZmluaXNoZWQKKwkJCXdoaWxlIChkb2NPZmZzZXQgPj0gdmlld2VyLmdldFRvcEluZGV4U3RhcnRPZmZzZXQoKQorCQkJCQkmJiBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KHZpZXdlci5nZXREb2N1bWVudCgpLmdldENoYXIoCisJCQkJCQkJZG9jT2Zmc2V0KSkpIHsKKwkJCQlkb2NPZmZzZXQtLTsKKwkJCX0KKwkJCS8vIHdlJ3ZlIGJlZW4gb25lIHN0ZXAgdG9vIGZhciA6IGluY3JlYXNlIHRoZSBvZmZzZXQKKwkJCWRvY09mZnNldCsrOworCQkJd29yZFBhcnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQoZG9jT2Zmc2V0LAorCQkJCQlkb2N1bWVudE9mZnNldCAtIGRvY09mZnNldCk7CisJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGRvIG5vdGhpbmcKKwkJfQorCX0KKworCS8qKgorCSAqIE1ldGhvZCBnZXRTdHJpbmcuCisJICogCisJICogQHJldHVybiBTdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKKwkJcmV0dXJuIHdvcmRQYXJ0OworCX0KKworCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworCQlyZXR1cm4gd29yZFBhcnQubGVuZ3RoKCk7CisJfQorCisJcHVibGljIGludCBnZXRPZmZzZXQoKSB7CisJCXJldHVybiBkb2NPZmZzZXQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY0F1dG9FZGl0U3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9FbWZhdGljQXV0b0VkaXRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMTc4NjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY0F1dG9FZGl0U3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuZWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuRW1mYXRpY1VJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0SW5kZW50TGluZUF1dG9FZGl0U3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247CisKK3B1YmxpYyBjbGFzcyBFbWZhdGljQXV0b0VkaXRTdHJhdGVneSBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKKworCUVtZmF0aWNFZGl0b3IgX2VkaXRvciA9IG51bGw7CisJcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZTsKKworCXB1YmxpYyBFbWZhdGljQXV0b0VkaXRTdHJhdGVneShFbWZhdGljRWRpdG9yIGVkaXRvcikgeworCQlfZWRpdG9yID0gZWRpdG9yOworCQlwcmVmZXJlbmNlU3RvcmUgPSBFbWZhdGljVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOworCX0KKworCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZCwgRG9jdW1lbnRDb21tYW5kIGMpIHsKKwkJaWYgKGMudGV4dCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGMudGV4dC5lbmRzV2l0aCgieyIpKSB7CisJCQlzbWFydEJyYWNlKGQsIGMpOworCQl9IGVsc2UgaWYgKGMudGV4dC5lbmRzV2l0aCgiXCIiKSkgeworCQkJaW5zZXJ0KGMsICIiLCAiXCIiKTsgCisJCX0gZWxzZSBpZiAoYy50ZXh0LmVuZHNXaXRoKCJbIikpIHsKKwkJCWMudGV4dCA9IGMudGV4dCArICIqXSI7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIERlZmF1bHRJbmRlbnRMaW5lQXV0b0VkaXRTdHJhdGVneQorCSAqLworCXByaXZhdGUgdm9pZCBzbWFydEJyYWNlKElEb2N1bWVudCBkLCBEb2N1bWVudENvbW1hbmQgYykgeworCQlpZiAoIXByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUF9CT09MRUFOKSkgeworCQkJcmV0dXJuOworCQl9CisJCWlmIChjLm9mZnNldCA9PSAtMSB8fCBkLmdldExlbmd0aCgpID09IDApIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmcgY29tcHV0ZWRJbmRlbnQgPSBjb21wdXRlSW5kZW50KGQsIGMpOworCQlTdHJpbmcgYmVmb3JlQ2FyZXQgPSAiXHJcbiIgKyBjb21wdXRlZEluZGVudCArICIgICAiOworCQlTdHJpbmcgYWZ0ZXJDYXJldCA9ICJcclxuIiArIGNvbXB1dGVkSW5kZW50ICsgIn0iOyAKKwkJaW5zZXJ0KGMsIGJlZm9yZUNhcmV0LCBhZnRlckNhcmV0KTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGluc2VydCAoRG9jdW1lbnRDb21tYW5kIGMsIFN0cmluZyBiZWZvcmVDYXJldCwgU3RyaW5nIGFmdGVyQ2FyZXQpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoYy50ZXh0KTsKKwkJYnVmLmFwcGVuZChiZWZvcmVDYXJldCk7CisJCWMuY2FyZXRPZmZzZXQgPSBjLm9mZnNldCArIGJlZm9yZUNhcmV0LnRvQ2hhckFycmF5KCkubGVuZ3RoICsgMTsKKwkJYy5zaGlmdHNDYXJldCA9IGZhbHNlOworCQlidWYuYXBwZW5kKGFmdGVyQ2FyZXQpOworCQljLmxlbmd0aCA9IDA7CisJCWMudGV4dCA9IGJ1Zi50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVJbmRlbnQoSURvY3VtZW50IGQsIERvY3VtZW50Q29tbWFuZCBjKSB7CisJCVN0cmluZyByZXMgPSAiIjsKKwkJdHJ5IHsKKwkJCWludCBwID0gKGMub2Zmc2V0ID09IGQuZ2V0TGVuZ3RoKCkgPyBjLm9mZnNldCAtIDEgOiBjLm9mZnNldCk7CisJCQlJUmVnaW9uIGluZm8gPSBkLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHApOworCQkJaW50IHN0YXJ0ID0gaW5mby5nZXRPZmZzZXQoKTsKKworCQkJLy8gZmluZCB3aGl0ZSBzcGFjZXMKKwkJCWludCBlbmQgPSBmaW5kRW5kT2ZXaGl0ZVNwYWNlKGQsIHN0YXJ0LCBjLm9mZnNldCk7CisKKwkJCWlmIChlbmQgPiBzdGFydCkgeworCQkJCXJlcyA9IGQuZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7CisJCQl9CisJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y3ApIHsKKwkJCS8vIHN0b3Agd29yaworCQl9CisJCXJldHVybiByZXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZmlyc3Qgb2Zmc2V0IGdyZWF0ZXIgdGhhbiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGFuZCBzbWFsbGVyCisJICogdGhhbiA8Y29kZT5lbmQ8L2NvZGU+IHdob3NlIGNoYXJhY3RlciBpcyBub3QgYSBzcGFjZSBvciB0YWIgY2hhcmFjdGVyLgorCSAqIElmIG5vIHN1Y2ggb2Zmc2V0IGlzIGZvdW5kLCA8Y29kZT5lbmQ8L2NvZGU+IGlzIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBkb2N1bWVudAorCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRvIHNlYXJjaCBpbgorCSAqIEBwYXJhbSBvZmZzZXQKKwkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgYXQgd2hpY2ggc2VhcmNoaW5nIHN0YXJ0CisJICogQHBhcmFtIGVuZAorCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBhdCB3aGljaCBzZWFyY2hpbmcgc3RvcHMKKwkgKiBAcmV0dXJuIHRoZSBvZmZzZXQgaW4gdGhlIHNwZWNpZmllZCByYW5nZSB3aG9zZSBjaGFyYWN0ZXIgaXMgbm90IGEgc3BhY2UKKwkgKiAgICAgICAgIG9yIHRhYgorCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICAgICBpZiBwb3NpdGlvbiBpcyBhbiBpbnZhbGlkIHJhbmdlIGluIHRoZSBnaXZlbiBkb2N1bWVudAorCSAqLworCXByb3RlY3RlZCBpbnQgZmluZEVuZE9mV2hpdGVTcGFjZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBlbmQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7CisJCXdoaWxlIChvZmZzZXQgPCBlbmQpIHsKKwkJCWNoYXIgYyA9IGRvY3VtZW50LmdldENoYXIob2Zmc2V0KTsKKwkJCWlmIChjICE9ICcgJyAmJiBjICE9ICdcdCcpIHsKKwkJCQlyZXR1cm4gb2Zmc2V0OworCQkJfQorCQkJb2Zmc2V0Kys7CisJCX0KKwkJcmV0dXJuIGVuZDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9FbWZhdGljQ29kZVNjYW5uZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9FbWZhdGljQ29kZVNjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU4MDk2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvZWRpdG9yL0VtZmF0aWNDb2RlU2Nhbm5lci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuZWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS51dGlsLkVtZmF0aWNCYXNpY1R5cGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUudXRpbC5FbWZhdGljS2V5d29yZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLnVpLmVkaXRvci5MRFRDb2RlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUudWkudXRpbC5MRFRDb2xvclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuTXVsdGlMaW5lUnVsZTsKKworcHVibGljIGNsYXNzIEVtZmF0aWNDb2RlU2Nhbm5lciBleHRlbmRzIExEVENvZGVTY2FubmVyCit7CisKKyAgICBwdWJsaWMgRW1mYXRpY0NvZGVTY2FubmVyKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdEtleXdvcmRzKCkKKyAgICB7CisgICAgICAgIGFkZEtleXdvcmRzKEVtZmF0aWNLZXl3b3Jkcy5HZXROb3JtYWxLZXl3b3JkcygpLCBMRFRDb2xvclByb3ZpZGVyLkJMVUUpOworICAgICAgICBhZGRLZXl3b3JkcyhFbWZhdGljS2V5d29yZHMuR2V0U3BlY2lhbEtleXdvcmRzKCksIExEVENvbG9yUHJvdmlkZXIuREFSS19CTFVFLCBudWxsLCAxKTsKKyAgICAgICAgYWRkS2V5d29yZHMoRW1mYXRpY0Jhc2ljVHlwZXMuR2V0QmFzaWNUeXBlTmFtZXMoKSwgTERUQ29sb3JQcm92aWRlci5EQVJLX0dSRUVOKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0TGl0ZXJhbHMoKQorICAgIHsKKyAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW4gbGl0ZXJhbFRva2VuID0gZ2V0TGl0ZXJhbFRva2VuKCk7CisgICAgICAgIGFkZFJ1bGUobmV3IE11bHRpTGluZVJ1bGUoIlwiIiwgIlwiIiwgbGl0ZXJhbFRva2VuLCAnXFwnKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvZWRpdG9yL0VtZmF0aWNFZGl0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9FbWZhdGljRWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5MjQxYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9FbWZhdGljRWRpdG9yLmphdmEKQEAgLTAsMCArMSw1MTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJpY3MudXRpbC5PbmVUb01hbnlNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmljcy51dGlsLk9uZVRvT25lTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkJvdW5kRXhjZXB0V2lsZGNhcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQ2xhc3NEZWNsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkNvbXBVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkVtZmF0aWNBU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5UeXBlV2l0aE11bHRpOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LldpbGRjYXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmh5cGVybGlua3MuRW1mYXRpY0h5cGVybGlua0RldGVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLm91dGxpbmUuRW1mYXRpY0NvbnRlbnRPdXRsaW5lUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5wYXJ0aXRpb24uRW1mYXRpY0RvY3VtZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkucmVkc3F1aWdnbGVzLkVtZmF0aWNDU1RDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS52aWV3cy5UeXBlc1ZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUub3V0bGluZS5PdXRsaW5lTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUudWkuZWRpdG9yLkxEVEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUudWkuZWRpdG9yLkxEVFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25TdXBwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5Tb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0TGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlNob3dJbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Db250ZW50QXNzaXN0QWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY0VkaXRvciBleHRlbmRzIExEVEVkaXRvciBpbXBsZW1lbnRzIElTaG93SW5UYXJnZXRMaXN0LAorCQlJU2hvd0luU291cmNlIHsKKworCXByaXZhdGUgRW1mYXRpY0VkaXRvclNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IEVtZmF0aWNFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcigKKwkJCXRoaXMpOworCXByaXZhdGUgRW1mYXRpY0NvbnRlbnRPdXRsaW5lUGFnZSBfZW1mYXRpY0NvbnRlbnRPdXRsaW5lUGFnZTsKKwlwcml2YXRlIEVtZmF0aWNLZXlMaXN0ZW5lciBfa2V5TGlzdGVuZXIgPSBudWxsOworCXByaXZhdGUgT3V0bGluZU5vZGVbXSBsYXN0U2hvd25PdXRsaW5lTm9kZXMgPSBuZXcgT3V0bGluZU5vZGVbMF07CisJcHJpdmF0ZSBJVmlld1JlZmVyZW5jZSBfdHlwZXNWaWV3UmVmZXJlbmNlID0gbnVsbDsKKworCXB1YmxpYyBFbWZhdGljRWRpdG9yKCkgeworCQlhZGRQYXJzZVRyZWVDaGFuZ2VkTGlzdGVuZXIobmV3IEVtZmF0aWNDU1RDaGFuZ2VMaXN0ZW5lcih0aGlzKSk7CisJCXNldERvY3VtZW50UHJvdmlkZXIobmV3IEVtZmF0aWNEb2N1bWVudFByb3ZpZGVyKCkpOworCX0KKworCXByb3RlY3RlZCBMRFRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNyZWF0ZVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSB7CisJCXJldHVybiBuZXcgRW1mYXRpY1NvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24odGhpcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVtZmF0aWNPdXRsaW5lQ29uZmlndXJhdGlvbiBjcmVhdGVPdXRsaW5lQ29uZmlndXJhdGlvbigpIHsKKwkJcmV0dXJuIG5ldyBFbWZhdGljT3V0bGluZUNvbmZpZ3VyYXRpb24odGhpcyk7CisJfQorCisJcHJpdmF0ZSBQcm9qZWN0aW9uU3VwcG9ydCBwcm9qZWN0aW9uU3VwcG9ydDsKKwlwcml2YXRlIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsOworCXByaXZhdGUgQW5ub3RhdGlvbltdIG9sZEFubm90YXRpb25zOworCisJLyoqCisJICogZm9sZGluZyBzdXBwb3J0LCBhcyBleHBsYWluZWQgaW4KKwkgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtRm9sZGluZy1pbi1FY2xpcHNlLVRleHQtRWRpdG9ycy9mb2xkaW5nLmh0bWwKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGVGb2xkaW5nU3RydWN0dXJlKExpc3Q8UG9zaXRpb24+IHBvc2l0aW9ucykgeworCQlpbml0Rm9sZGluZ1N1cHBvcnQoKTsKKwkJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bcG9zaXRpb25zLnNpemUoKV07CisJCS8vIHRoZSBuZXcgKGFubm90YXRpb24sIHBvc2l0aW9uKSBwYWlycworCQlIYXNoTWFwPFByb2plY3Rpb25Bbm5vdGF0aW9uLCBQb3NpdGlvbj4gbmV3QW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcDxQcm9qZWN0aW9uQW5ub3RhdGlvbiwgUG9zaXRpb24+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLnNpemUoKTsgaSsrKSB7CisJCQlQcm9qZWN0aW9uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uKCk7CisJCQluZXdBbm5vdGF0aW9ucy5wdXQoYW5ub3RhdGlvbiwgcG9zaXRpb25zLmdldChpKSk7CisJCQlhbm5vdGF0aW9uc1tpXSA9IGFubm90YXRpb247CisJCX0KKwkJYW5ub3RhdGlvbk1vZGVsLm1vZGlmeUFubm90YXRpb25zKG9sZEFubm90YXRpb25zLCBuZXdBbm5vdGF0aW9ucywgbnVsbCk7CisJCW9sZEFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisJfQorCisJLyoqCisJICogZm9sZGluZyBzdXBwb3J0LCBhcyBleHBsYWluZWQgaW4KKwkgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtRm9sZGluZy1pbi1FY2xpcHNlLVRleHQtRWRpdG9ycy9mb2xkaW5nLmh0bWwKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7CisJCWluaXRGb2xkaW5nU3VwcG9ydCgpOworCQlzZWxlY3Rpb25MaXN0ZW5lci5pbnN0YWxsKGdldFNlbGVjdGlvblByb3ZpZGVyKCkpOworCQlfa2V5TGlzdGVuZXIgPSBuZXcgRW1mYXRpY0tleUxpc3RlbmVyKHRoaXMpOworCQlnZXRTb3VyY2VWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkuYWRkS2V5TGlzdGVuZXIoX2tleUxpc3RlbmVyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdEZvbGRpbmdTdXBwb3J0KCkgeworCQlpZiAoYW5ub3RhdGlvbk1vZGVsID09IG51bGwpIHsKKwkJCVByb2plY3Rpb25WaWV3ZXIgdmlld2VyID0gKFByb2plY3Rpb25WaWV3ZXIpIGdldFNvdXJjZVZpZXdlcigpOworCQkJcHJvamVjdGlvblN1cHBvcnQgPSBuZXcgUHJvamVjdGlvblN1cHBvcnQodmlld2VyLAorCQkJCQlnZXRBbm5vdGF0aW9uQWNjZXNzKCksIGdldFNoYXJlZENvbG9ycygpKTsKKwkJCS8vIHNlZSBBbnRFZGl0b3IgZm9yIGhvdmVycyBkaXNwbGF5aW5nIEhUTUwKKwkJCS8qCisJCQkgKiBBIHN1bW1hcnkgaXMgYW4gYW5ub3RhdGlvbiB0aGF0IGdldHMgY3JlYXRlZCBvdXQgb2YgYWxsCisJCQkgKiBhbm5vdGF0aW9ucyB3aXRoIGEgdHlwZSB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgdGhyb3VnaCB0aGlzCisJCQkgKiBtZXRob2QgYW5kIHRoYXQgYXJlIGluc2lkZSB0aGUgZm9sZGVkIHJlZ2lvbi4KKwkJCSAqIAorCQkJICovCisJCQlwcm9qZWN0aW9uU3VwcG9ydAorCQkJCQkuYWRkU3VtbWFyaXphYmxlQW5ub3RhdGlvblR5cGUoIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmVycm9yIik7CisJCQlwcm9qZWN0aW9uU3VwcG9ydAorCQkJCQkuYWRkU3VtbWFyaXphYmxlQW5ub3RhdGlvblR5cGUoIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLndhcm5pbmciKTsKKwkJCXByb2plY3Rpb25TdXBwb3J0Lmluc3RhbGwoKTsKKwkJCS8vIHR1cm4gcHJvamVjdGlvbiBtb2RlIG9uCisJCQl2aWV3ZXIuZG9PcGVyYXRpb24oUHJvamVjdGlvblZpZXdlci5UT0dHTEUpOworCQkJYW5ub3RhdGlvbk1vZGVsID0gdmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIGZvbGRpbmcgc3VwcG9ydCwgYXMgZXhwbGFpbmVkIGluCisJICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9hcnRpY2xlcy9BcnRpY2xlLUZvbGRpbmctaW4tRWNsaXBzZS1UZXh0LUVkaXRvcnMvZm9sZGluZy5odG1sCisJICogCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNjcmVhdGVTb3VyY2VWaWV3ZXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAorCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXIsIGludCkKKwkgKi8KKwlwcm90ZWN0ZWQgSVNvdXJjZVZpZXdlciBjcmVhdGVTb3VyY2VWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwKKwkJCUlWZXJ0aWNhbFJ1bGVyIHJ1bGVyLCBpbnQgc3R5bGVzKSB7CisJCWZBbm5vdGF0aW9uQWNjZXNzID0gZ2V0QW5ub3RhdGlvbkFjY2VzcygpOworCQlmT3ZlcnZpZXdSdWxlciA9IGNyZWF0ZU92ZXJ2aWV3UnVsZXIoZ2V0U2hhcmVkQ29sb3JzKCkpOworCQlJU291cmNlVmlld2VyIHZpZXdlciA9IG5ldyBQcm9qZWN0aW9uVmlld2VyKHBhcmVudCwgcnVsZXIsCisJCQkJZ2V0T3ZlcnZpZXdSdWxlcigpLCBpc092ZXJ2aWV3UnVsZXJWaXNpYmxlKCksIHN0eWxlcyk7CisJCS8vIGVuc3VyZSBkZWNvcmF0aW9uIHN1cHBvcnQgaGFzIGJlZW4gY3JlYXRlZCBhbmQgY29uZmlndXJlZC4KKwkJZ2V0U291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQodmlld2VyKTsKKwkJLy8gdmlld2VyLmFkZFRleHRMaXN0ZW5lcih0ZXh0TGlzdGVuZXIpOworCQlyZXR1cm4gdmlld2VyOworCX0KKworCS8qCisJICogTERUIGhhcyBhbHJlYWR5IHN1cHBvcnQgZm9yIHRoaXMgKGFzIHdlbGwgYXMgZm9yIElUZXh0TGlzdGVuZXIpLiBJCisJICogcmVhbGl6ZWQgYWZ0ZXIgYWRkaW5nIGl0IGhlcmUKKwkgKi8KKwlwdWJsaWMgRW1mYXRpY0FTVE5vZGUgZ2V0Q2xvc2VzdEVuY2xvc2luZ0FTVE5vZGVBdChpbnQgb2Zmc2V0LCBDbGFzcyBmaWx0ZXIpIHsKKwkJcmV0dXJuIGdldENsb3Nlc3RFbmNsb3NpbmdBU1ROb2RlQXQob2Zmc2V0LCAwLCBmaWx0ZXIpOworCX0KKworCXB1YmxpYyBFbWZhdGljQVNUTm9kZSBnZXRDbG9zZXN0RW5jbG9zaW5nQVNUTm9kZUF0KGludCBvZmZzZXQsIGludCBsZW5ndGgsCisJCQlDbGFzcyBmaWx0ZXIpIHsKKwkJRW1mYXRpY0FTVE5vZGUgbm9kZSA9IGdldENsb3Nlc3RFbmNsb3NpbmdBU1ROb2RlQXRXaXRoaW4oCisJCQkJZ2V0UGFyc2VSb290KCksIG9mZnNldCwgbGVuZ3RoLCBmaWx0ZXIpOworCQlyZXR1cm4gbm9kZTsKKwl9CisKKwlwcml2YXRlIEVtZmF0aWNBU1ROb2RlIGdldENsb3Nlc3RFbmNsb3NpbmdBU1ROb2RlQXRXaXRoaW4oQVNUTm9kZSB3aXRoaW4sCisJCQlpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDbGFzcyBmaWx0ZXIpIHsKKwkJaWYgKHdpdGhpbiA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlBU1ROb2RlIG5vZGUgPSB3aXRoaW4uZ2V0Tm9kZUF0KG9mZnNldCwgMCk7CisJCS8vIHNlYXJjaCB3aXRoaW4gdGhlIGZvciBhbnkgQVNUTm9kZQorCQlmb3IgKGludCBpID0gb2Zmc2V0ICsgMTsgKG5vZGUgPT0gbnVsbCkgJiYgKGkgPCBvZmZzZXQgKyBsZW5ndGgpOyBpKyspIHsKKwkJCW5vZGUgPSBnZXRQYXJzZVJvb3QoKS5nZXROb2RlQXQoaSwgMCk7CisJCX0KKwkJaWYgKG5vZGUgIT0gbnVsbCkgeworCQkJLyoKKwkJCSAqIEFuIG91dGVyIG5vZGUgZnVsZmlsbGluZyB0aGUgZmlsdGVyIGNvbmRpdGlvbiBtYXkgaGF2ZSBiZWVuIGZvdW5kCisJCQkgKiB3aGljaCBoaWRlcyBhIG1vcmUgc3BlY2lmaWMgbm9kZSBhbHNvIGZ1bGZpbGxpbmcgdGhlIGZpbHRlcgorCQkJICovCisJCQlpZiAobm9kZS5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKKwkJCQlmb3IgKEFTVE5vZGUgY2hpbGQgOiBub2RlLmdldENoaWxkcmVuKCkpIHsKKwkJCQkJQVNUTm9kZSBpbm5lck5vZGUgPSBnZXRDbG9zZXN0RW5jbG9zaW5nQVNUTm9kZUF0V2l0aGluKAorCQkJCQkJCWNoaWxkLCBvZmZzZXQsIGxlbmd0aCwgZmlsdGVyKTsKKwkJCQkJaWYgKGlubmVyTm9kZSAhPSBudWxsKSB7CisJCQkJCQlub2RlID0gaW5uZXJOb2RlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICogc2VhcmNoIHVwd2FyZHMgdGlsbCBmaW5kaW5nIGEgbm9kZSBvZiB0eXBlIGZpbHRlciwgb3IgcmVhY2hpbmcKKwkJCSAqIHRoZSByb290CisJCQkgKi8KKwkJCXdoaWxlICghZmlsdGVyLmlzSW5zdGFuY2Uobm9kZSkgJiYgKG5vZGUuZ2V0UGFyZW50KCkgIT0gbnVsbCkpIHsKKwkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnQoKTsKKwkJCX0KKwkJfQorCQlpZiAoZmlsdGVyLmlzSW5zdGFuY2Uobm9kZSkpIHsKKwkJCXJldHVybiAoRW1mYXRpY0FTVE5vZGUpIG5vZGU7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmIChzZWxlY3Rpb25MaXN0ZW5lciAhPSBudWxsKSB7CisJCQlzZWxlY3Rpb25MaXN0ZW5lci51bmluc3RhbGwoZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7CisJCQlzZWxlY3Rpb25MaXN0ZW5lciA9IG51bGw7CisJCX0KKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCXB1YmxpYyBPbmVUb09uZU1hcDxBU1ROb2RlLCBFT2JqZWN0PiBnZXRDc3REZWNsMkVjb3JlQVNUKCkgeworCQlDb21wVW5pdCBjb21wVW5pdCA9IChDb21wVW5pdCkgZ2V0UGFyc2VSb290KCk7CisJCWlmIChjb21wVW5pdCAhPSBudWxsKSB7CisJCQlyZXR1cm4gY29tcFVuaXQuZ2V0Q3N0RGVjbDJFY29yZUFTVCgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBPbmVUb01hbnlNYXA8RU9iamVjdCwgQVNUTm9kZT4gZ2V0RWNvcmVEZWNsMkNzdFVzZSgpIHsKKwkJQ29tcFVuaXQgY29tcFVuaXQgPSAoQ29tcFVuaXQpIGdldFBhcnNlUm9vdCgpOworCQlpZiAoY29tcFVuaXQgIT0gbnVsbCkgeworCQkJcmV0dXJuIGNvbXBVbml0LmdldEVjb3JlRGVjbDJDc3RVc2UoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgeworCQlJRG9jdW1lbnQgZG9jID0gbnVsbDsKKwkJaWYgKGdldERvY3VtZW50UHJvdmlkZXIoKSA9PSBudWxsKSB7CisJCQlyZXR1cm4gZG9jOworCQl9CisJCWRvYyA9IGdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKTsKKwkJcmV0dXJuIGRvYzsKKwl9CisKKwlwdWJsaWMgdm9pZCBvcGVuVGFyZ2V0KEVtZmF0aWNBU1ROb2RlIGxpbmtUYXJnZXQpIHsKKwkJc2V0U2VsZWN0aW9uKGxpbmtUYXJnZXQsIHRydWUpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihFbWZhdGljQVNUTm9kZSByZWZlcmVuY2UsIGJvb2xlYW4gbW92ZUN1cnNvcikgeworCQlpZiAocmVmZXJlbmNlID09IG51bGwpIHsKKwkJCWlmIChtb3ZlQ3Vyc29yKSB7CisJCQkJcmVzZXRIaWdobGlnaHRSYW5nZSgpOworCQkJCW1hcmtJbk5hdmlnYXRpb25IaXN0b3J5KCk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAobW92ZUN1cnNvcikgeworCQkJbWFya0luTmF2aWdhdGlvbkhpc3RvcnkoKTsKKwkJfQorCisJCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyID0gZ2V0U291cmNlVmlld2VyKCk7CisJCWlmIChzb3VyY2VWaWV3ZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCVN0eWxlZFRleHQgdGV4dFdpZGdldCA9IHNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7CisJCWlmICh0ZXh0V2lkZ2V0ID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXRyeSB7CisJCQlpbnQgb2Zmc2V0ID0gcmVmZXJlbmNlLmdldFJhbmdlU3RhcnQoKTsKKwkJCWlmIChvZmZzZXQgPCAwKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaW50IGxlbmd0aCA9IHJlZmVyZW5jZS5nZXRSYW5nZUxlbmd0aCgpOworCQkJdGV4dFdpZGdldC5zZXRSZWRyYXcoZmFsc2UpOworCQkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCQlzZXRIaWdobGlnaHRSYW5nZShvZmZzZXQsIGxlbmd0aCwgbW92ZUN1cnNvcik7CisJCQl9CisJCQlpZiAoIW1vdmVDdXJzb3IpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAob2Zmc2V0ID4gLTEgJiYgbGVuZ3RoID4gMCkgeworCQkJCXNvdXJjZVZpZXdlci5yZXZlYWxSYW5nZShvZmZzZXQsIGxlbmd0aCk7CisJCQkJLy8gU2VsZWN0ZWQgcmVnaW9uIGJlZ2lucyBvbmUgaW5kZXggYWZ0ZXIgb2Zmc2V0CisJCQkJc291cmNlVmlld2VyLnNldFNlbGVjdGVkUmFuZ2Uob2Zmc2V0LCBsZW5ndGgpOworCQkJCW1hcmtJbk5hdmlnYXRpb25IaXN0b3J5KCk7CisJCQl9CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB4KSB7CisJCQl4LnByaW50U3RhY2tUcmFjZSgpOworCQl9IGZpbmFsbHkgeworCQkJdGV4dFdpZGdldC5zZXRSZWRyYXcodHJ1ZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb250ZW50T3V0bGluZVBhZ2UoCisJCQlFbWZhdGljQ29udGVudE91dGxpbmVQYWdlIGVtZmF0aWNDb250ZW50T3V0bGluZVBhZ2UpIHsKKwkJX2VtZmF0aWNDb250ZW50T3V0bGluZVBhZ2UgPSBlbWZhdGljQ29udGVudE91dGxpbmVQYWdlOworCisJfQorCisJcHJvdGVjdGVkIEVtZmF0aWNDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkgeworCQlyZXR1cm4gX2VtZmF0aWNDb250ZW50T3V0bGluZVBhZ2U7CisJfQorCisJcHVibGljIEVPYmplY3QgZ2V0RWNvcmVEZWNsQXRDdXJzb3IoKSB7CisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7CisJCQlJVGV4dFNlbGVjdGlvbiB0cyA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOworCQkJaW50IG9mZnNldCA9IHRzLmdldE9mZnNldCgpOworCQkJaW50IGxlbmd0aCA9IHRzLmdldExlbmd0aCgpOworCQkJUmVmZXJlZEVjb3JlRGVjbCByZWQgPSBnZXRSZWZlcmVkRWNvcmVEZWNsKG9mZnNldCwgbGVuZ3RoKTsKKwkJCWlmIChyZWQgPT0gbnVsbCB8fCByZWQuZWNvcmVEZWNsID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCUVPYmplY3QgZWNvcmVEZWNsID0gcmVkLmVjb3JlRGVjbDsKKwkJCXJldHVybiBlY29yZURlY2w7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIEVPYmplY3QgZ290b0RlY2xhcmF0aW9uKCkgeworCQlFT2JqZWN0IGVjb3JlRGVjbCA9IGdldEVjb3JlRGVjbEF0Q3Vyc29yKCk7CisJCWlmIChlY29yZURlY2wgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJRW1mYXRpY0FTVE5vZGUgbGFuZGluZ1BsYWNlID0gRW1mYXRpY0h5cGVybGlua0RldGVjdG9yLmdldExhbmRpbmdQbGFjZSgKKwkJCQllY29yZURlY2wsIHRoaXMpOworCQlzZXRTZWxlY3Rpb24obGFuZGluZ1BsYWNlLCB0cnVlKTsKKwkJcmV0dXJuIGVjb3JlRGVjbDsKKwl9CisKKwlwdWJsaWMgUmVmZXJlZEVjb3JlRGVjbCBnZXRSZWZlcmVkRWNvcmVEZWNsKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKwkJLyoKKwkJICogZmlyc3QgY2hhbmNlOiBXaWxkY2FyZAorCQkgKi8KKwkJRW1mYXRpY0FTVE5vZGUgbm9kZSA9IGdldENsb3Nlc3RFbmNsb3NpbmdBU1ROb2RlQXQob2Zmc2V0LCBsZW5ndGgsCisJCQkJV2lsZGNhcmQuY2xhc3MpOworCQlpZiAobm9kZSAhPSBudWxsKSB7CisJCQkvLyBpdCBjYW4gc3RpbGwgYmUgYW4gdW5ib3VuZGVkIHdpbGRjYXJkCisJCQlub2RlID0gKChXaWxkY2FyZCkgbm9kZSkuZ2V0Qm91bmRFeGNlcHRXaWxkY2FyZCgpOworCQl9CisJCWlmIChub2RlID09IG51bGwpIHsKKwkJCS8vIHNlY29uZCBjaGFuY2U6IEJvdW5kRXhjZXB0V2lsZGNhcmQKKwkJCW5vZGUgPSBnZXRDbG9zZXN0RW5jbG9zaW5nQVNUTm9kZUF0KG9mZnNldCwgbGVuZ3RoLAorCQkJCQlCb3VuZEV4Y2VwdFdpbGRjYXJkLmNsYXNzKTsKKwkJCWlmIChub2RlID09IG51bGwpIHsKKwkJCQkvLyB0aGlyIGNoYW5jZTogVHlwZVdpdGhNdWx0CisJCQkJbm9kZSA9IGdldENsb3Nlc3RFbmNsb3NpbmdBU1ROb2RlQXQob2Zmc2V0LCBsZW5ndGgsCisJCQkJCQlUeXBlV2l0aE11bHRpLmNsYXNzKTsKKwkJCQlpZiAobm9kZSA9PSBudWxsKSB7CisJCQkJCS8vIGZvdXJ0aCBjaGFuY2U6IFJlZmVyZW5jZSAoZm9yIGFuIG9wcG9zaXRlIHJlZmVyZW5jZSkKKwkJCQkJbm9kZSA9IGdldENsb3Nlc3RFbmNsb3NpbmdBU1ROb2RlQXQob2Zmc2V0LCBsZW5ndGgsCisJCQkJCQkJUmVmZXJlbmNlLmNsYXNzKTsKKwkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQkJbm9kZSA9ICgoUmVmZXJlbmNlKSBub2RlKS5nZXRPcHBvc2l0ZU5hbWUoKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBsZWF2ZSBhIEJvdW5kRXhjZXB0V2lsZGNhcmQgaW4gbm9kZQorCQkJCQlub2RlID0gKChUeXBlV2l0aE11bHRpKSBub2RlKS5nZXROYW1lKCk7CisJCQkJfQorCQkJfQorCQl9CisJCS8vIGFjdHVhbGx5IHRoZSBRdWFsaWZpZWRJRCB3YXMgcGxhY2VkIGluIHRoZSBiaWdNYXAKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBCb3VuZEV4Y2VwdFdpbGRjYXJkKSB7CisJCQlub2RlID0gKChCb3VuZEV4Y2VwdFdpbGRjYXJkKSBub2RlKQorCQkJCQkuZ2V0UmF3VE5hbWVPclRWYXJPclBhcmFtemVkVE5hbWUoKTsKKwkJfQorCQlFT2JqZWN0IGVjb3JlRGVjbCA9IGdldEVjb3JlRGVjbDJDc3RVc2UoKS5nZXRJbnYobm9kZSk7CisJCVJlZmVyZWRFY29yZURlY2wgcmVzID0gbmV3IFJlZmVyZWRFY29yZURlY2woKTsKKwkJcmVzLmVjb3JlRGVjbCA9IGVjb3JlRGVjbDsKKwkJcmVzLm5vZGUgPSBub2RlOworCQlyZXR1cm4gcmVzOworCX0KKworCXB1YmxpYyBjbGFzcyBSZWZlcmVkRWNvcmVEZWNsIHsKKwkJcHVibGljIEVPYmplY3QgZWNvcmVEZWNsOworCQlwdWJsaWMgRW1mYXRpY0FTVE5vZGUgbm9kZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgeworCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7CisJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IEVtZmF0aWNFZGl0b3JNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOworCisJCUlBY3Rpb24gYWN0aW9uID0gbmV3IENvbnRlbnRBc3Npc3RBY3Rpb24oYnVuZGxlLAorCQkJCSJDb250ZW50QXNzaXN0UHJvcG9zYWwuIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKKwkJYWN0aW9uCisJCQkJLnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTKTsKKwkJc2V0QWN0aW9uKCJDb250ZW50QXNzaXN0UHJvcG9zYWwiLCBhY3Rpb24pOyAvLyROT04tTkxTLTEkCisJCW1hcmtBc1N0YXRlRGVwZW5kZW50QWN0aW9uKCJDb250ZW50QXNzaXN0UHJvcG9zYWwiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBUT0RPIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYWN0aW9uLAorCQkvLyBoZWxwQ29udGV4dElkKTsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBPdXRsaW5lTm9kZVtdIGdldE91dGxpbmVFbGVtZW50cygpIHsKKwkJT3V0bGluZU5vZGVbXSBjYW5kaWRhdGVPdXRsaW5lTm9kZXMgPSBzdXBlci5nZXRPdXRsaW5lRWxlbWVudHMoKTsKKwkJaWYgKGNhbmRpZGF0ZU91dGxpbmVOb2RlcyAhPSBudWxsICYmIGNhbmRpZGF0ZU91dGxpbmVOb2Rlcy5sZW5ndGggPiAwKSB7CisJCQlsYXN0U2hvd25PdXRsaW5lTm9kZXMgPSBjYW5kaWRhdGVPdXRsaW5lTm9kZXM7CisJCX0KKwkJcmV0dXJuIGxhc3RTaG93bk91dGxpbmVOb2RlczsKKwl9CisKKwkvKioKKwkgKiBzZWUgcC4gNDY3IGFuZCBwLiA0OTkgb2YgSkRHRSAybmQgRWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0U2hvd0luVGFyZ2V0SWRzKCkgeworCQlFT2JqZWN0IGVjb3JlRGVjbCA9IGdldEVjb3JlRGVjbEF0Q3Vyc29yKCk7CisJCVN0cmluZ1tdIHJlcyA9IG51bGw7CisJCWlmIChlY29yZURlY2wgPT0gbnVsbCkgeworCQkJZWNvcmVEZWNsID0gZ2V0RWNvcmVEZWNsQXRDdXJzb3IyKCk7CisJCQlpZiAoZWNvcmVEZWNsID09IG51bGwpIHsKKwkJCQlyZXMgPSBuZXcgU3RyaW5nW10ge307CisJCQl9IGVsc2UgeworCQkJCXJlcyA9IG5ldyBTdHJpbmdbXSB7VHlwZXNWaWV3LklEIH07CisJCQl9CisJCQkKKwkJfSBlbHNlIHsKKwkJCXJlcyA9IG5ldyBTdHJpbmdbXSB7IFR5cGVzVmlldy5JRCB9OworCQl9CisJCXJldHVybiByZXM7CisJfQorCisJcHJpdmF0ZSBFT2JqZWN0IGdldEVjb3JlRGVjbEF0Q3Vyc29yMigpIHsKKwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKKwkJCUlUZXh0U2VsZWN0aW9uIHRzID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247CisJCQlpbnQgb2Zmc2V0ID0gdHMuZ2V0T2Zmc2V0KCk7CisJCQlpbnQgbGVuZ3RoID0gdHMuZ2V0TGVuZ3RoKCk7CisJCQlBU1ROb2RlIG5vZGUgPSBnZXRDbG9zZXN0RW5jbG9zaW5nQVNUTm9kZUF0KG9mZnNldCwgQ2xhc3NEZWNsLmNsYXNzKTsKKwkJCWlmIChub2RlID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsgCisJCQl9CisJCQlFT2JqZWN0IGVjb3JlRGVjbCA9IGdldENzdERlY2wyRWNvcmVBU1QoKS5nZXQobm9kZSk7CisJCQlyZXR1cm4gZWNvcmVEZWNsOworCQl9CisJCXJldHVybiBudWxsOworCisJfQorCisJLyoqCisJICogc2VlIHAuIDQ2NyBhbmQgcC4gNDk5IG9mIEpER0UgMm5kIEVkCisJICovCisJcHVibGljIFNob3dJbkNvbnRleHQgZ2V0U2hvd0luQ29udGV4dCgpIHsKKwkJRmlsZUVkaXRvcklucHV0IGZlaSA9IChGaWxlRWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCk7CisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKKwkJSUZpbGUgZiA9IGZlaS5nZXRGaWxlKCk7CisJCVNob3dJbkNvbnRleHQgcmVzID0gbmV3IFNob3dJbkNvbnRleHQoZiwgc2VsZWN0aW9uKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgdm9pZCBzaG93SW5UeXBlSGllcmFyY2h5KEVDbGFzcyBvcGVuZWREZWNsKSB7CisJCWlmICghKG9wZW5lZERlY2wgaW5zdGFuY2VvZiBFQ2xhc3MpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJVHlwZXNWaWV3IHR2ID0gZ2V0VHlwZXNWaWV3KCk7CisJCWlmICh0diA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJV2Vha1JlZmVyZW5jZTxFQ2xhc3M+IHdyQyA9IG5ldyBXZWFrUmVmZXJlbmNlPEVDbGFzcz4oCisJCQkJKEVDbGFzcykgb3BlbmVkRGVjbCk7CisJCXR2LnNldElucHV0KHdyQywgdHJ1ZSk7CisJfQorCisJcHVibGljIFR5cGVzVmlldyBnZXRUeXBlc1ZpZXcoKSB7CisJCS8vIDEpIHRyeSBpZiB0aGVyZSdzIGEgY2FjaGVkIHJlZmVyZW5jZQorCQlpZiAoX3R5cGVzVmlld1JlZmVyZW5jZSAhPSBudWxsKSB7CisJCQlUeXBlc1ZpZXcgdHYgPSAoVHlwZXNWaWV3KSBfdHlwZXNWaWV3UmVmZXJlbmNlLmdldFZpZXcoZmFsc2UpOworCQkJaWYgKHR2ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdHY7CisJCQl9CisJCX0KKwkJLy8gMikgbG9vayBmb3IgdGhlIHZpZXcgb3BlbmVkIGJ5IHRoZSB1c2VyCisJCUlXb3JrYmVuY2hQYWdlIHdwID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQorCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7CisJCUlWaWV3UmVmZXJlbmNlIF90eXBlc1ZpZXdSZWZlcmVuY2UgPSB3cC5maW5kVmlld1JlZmVyZW5jZShUeXBlc1ZpZXcuSUQpOworCQlpZiAoX3R5cGVzVmlld1JlZmVyZW5jZSAhPSBudWxsKSB7CisJCQlUeXBlc1ZpZXcgdHYgPSAoVHlwZXNWaWV3KSBfdHlwZXNWaWV3UmVmZXJlbmNlLmdldFZpZXcodHJ1ZSk7CisJCQlpZiAodHYgIT0gbnVsbCkgeworCQkJCXJldHVybiB0djsKKwkJCX0KKwkJfQorCQkvLyAzKSBvcGVuIGl0IHByb2dyYW1hdGljYWxseQorCQl0cnkgeworCQkJSVZpZXdQYXJ0IHR2ID0gd3Auc2hvd1ZpZXcoVHlwZXNWaWV3LklEKTsKKwkJCXJldHVybiAoVHlwZXNWaWV3KSB0djsKKwkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJCisJCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY0VkaXRvckFjdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY0VkaXRvckFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyNjJjMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9FbWZhdGljRWRpdG9yQWN0aW9uQ29udHJpYnV0b3IuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvci5hY3Rpb25zLk9wZW5EZWNsYXJhdGlvbkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUudWkuZWRpdG9yLkxEVEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY0VkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuZHMgTERURWRpdG9yQWN0aW9uQ29udHJpYnV0b3IgeworCisJLy8gcHJpdmF0ZSBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkNvbnRlbnRBc3Npc3RQcm9wb3NhbDsKKwlwcml2YXRlIE9wZW5EZWNsYXJhdGlvbkFjdGlvbiBmT3BlbkRlY2xhcmF0aW9uQWN0aW9uOworCisJcHVibGljIEVtZmF0aWNFZGl0b3JBY3Rpb25Db250cmlidXRvcigpIHsKKwkJc3VwZXIoKTsKKwkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gRW1mYXRpY0VkaXRvck1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCk7CisKKwkJLyoKKwkJICogZkNvbnRlbnRBc3Npc3RQcm9wb3NhbCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24oYnVuZGxlLAorCQkgKiAiQ29udGVudEFzc2lzdFByb3Bvc2FsLiIpOyAvLyROT04tTkxTLTEkCisJCSAqLworCQlTdHJpbmcgY29tbWFuZElkID0gSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkNPTlRFTlRfQVNTSVNUX1BST1BPU0FMUzsKKwkJLy8gZkNvbnRlbnRBc3Npc3RQcm9wb3NhbC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoY29tbWFuZElkKTsKKworCX0KKworCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKKwkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51KTsKKworCQkvKgorCQkgKiBpZiAoZkNvbnRlbnRBc3Npc3RQcm9wb3NhbCAhPSBudWxsKSB7IElNZW51TWFuYWdlciBlZGl0TWVudSA9IG1lbnUKKwkJICogLmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKKwkJICogZWRpdE1lbnUuYXBwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKKwkJICogZkNvbnRlbnRBc3Npc3RQcm9wb3NhbCk7IH0KKwkJICovCisKKwkJaWYgKGZPcGVuRGVjbGFyYXRpb25BY3Rpb24gIT0gbnVsbCkgeworCQkJSU1lbnVNYW5hZ2VyIG5hdmlnYXRlTWVudSA9IG1lbnUKKwkJCQkJLmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9OQVZJR0FURSk7CisJCQlpZiAobmF2aWdhdGVNZW51ICE9IG51bGwpIHsKKwkJCQluYXZpZ2F0ZU1lbnUuYXBwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk9QRU5fRVhULAorCQkJCQkJZk9wZW5EZWNsYXJhdGlvbkFjdGlvbik7CisJCQkJbmF2aWdhdGVNZW51LnNldFZpc2libGUodHJ1ZSk7CisJCQl9CisJCX0KKworCX0KKworCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KSB7CisJCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihwYXJ0KTsKKworCQlJVGV4dEVkaXRvciBlZGl0b3IgPSBudWxsOworCQlpZiAocGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7CisJCQllZGl0b3IgPSAoSVRleHRFZGl0b3IpIHBhcnQ7CisJCX0KKworCQkvKgorCQkgKiBmQ29udGVudEFzc2lzdFByb3Bvc2FsLnNldEFjdGlvbihnZXRBY3Rpb24oZWRpdG9yLAorCQkgKiAiQ29udGVudEFzc2lzdFByb3Bvc2FsIikpOyAvLyROT04tTkxTLTEkCisJCSAqLworCisJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBFbWZhdGljRWRpdG9yKSB7CisJCQlFbWZhdGljRWRpdG9yIF9lZGl0b3IgPSAoRW1mYXRpY0VkaXRvcikgcGFydDsKKworCQkJaWYgKGZPcGVuRGVjbGFyYXRpb25BY3Rpb24gPT0gbnVsbCkgeworCQkJCWZPcGVuRGVjbGFyYXRpb25BY3Rpb24gPSBuZXcgT3BlbkRlY2xhcmF0aW9uQWN0aW9uKF9lZGl0b3IpOworCQkJCWNvbnRyaWJ1dGVUb01lbnUoZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCkpOworCQkJfQorCQkJaWYgKGZPcGVuRGVjbGFyYXRpb25BY3Rpb24gIT0gbnVsbCkgeworCQkJCWZPcGVuRGVjbGFyYXRpb25BY3Rpb24uc2V0RWRpdG9yKF9lZGl0b3IpOworCQkJfQorCisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9FbWZhdGljRWRpdG9yTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9FbWZhdGljRWRpdG9yTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTAxOWNiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvZWRpdG9yL0VtZmF0aWNFZGl0b3JNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY0VkaXRvck1lc3NhZ2VzIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5lZGl0b3IuRW1mYXRpY0VkaXRvck1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7CisKKwlwcml2YXRlIEVtZmF0aWNFZGl0b3JNZXNzYWdlcygpIHsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOworCQl9CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKKwkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvZWRpdG9yL0VtZmF0aWNFZGl0b3JNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvZWRpdG9yL0VtZmF0aWNFZGl0b3JNZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyY2EwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY0VkaXRvck1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMSBAQAorCitDb250ZW50QXNzaXN0UHJvcG9zYWwubGFiZWw9Q29udGVudCAmQXNzaXN0QEN0cmwrU3BhY2UKK0NvbnRlbnRBc3Npc3RQcm9wb3NhbC50b29sdGlwPUNvbnRlbnQgQXNzaXN0CitDb250ZW50QXNzaXN0UHJvcG9zYWwuaW1hZ2U9CitDb250ZW50QXNzaXN0UHJvcG9zYWwuZGVzY3JpcHRpb249Q29udGVudCBBc3Npc3QKKworQ29udGVudEZvcm1hdC5sYWJlbD0mRm9ybWF0CitDb250ZW50Rm9ybWF0LnRvb2x0aXA9Rm9ybWF0IGJ1aWxkIGZpbGUgc291cmNlCitDb250ZW50Rm9ybWF0LmltYWdlPQorQ29udGVudEZvcm1hdC5kZXNjcmlwdGlvbj1Gb3JtYXQgYnVpbGQgZmlsZSBzb3VyY2UKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvZWRpdG9yL0VtZmF0aWNFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvZWRpdG9yL0VtZmF0aWNFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMWQ0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY0VkaXRvclNlbGVjdGlvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwyNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Cb3VuZEV4Y2VwdFdpbGRjYXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkNvbXBVbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkVtZmF0aWNBU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlRvcExldmVsRGVjbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5vdXRsaW5lLk91dGxpbmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JU3luY2hyb25pemFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY0VkaXRvclNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7CisKKwlwcml2YXRlIEVtZmF0aWNFZGl0b3IgX2VkaXRvciA9IG51bGw7CisKKwlwdWJsaWMgRW1mYXRpY0VkaXRvclNlbGVjdGlvbkxpc3RlbmVyKEVtZmF0aWNFZGl0b3IgZWRpdG9yKSB7CisJCV9lZGl0b3IgPSBlZGl0b3I7CisJfQorCisJLyoqCisJICogcGxhY2VzIGFzIGluIHRoZSBKYXZhIGVkaXRvciBhIGhpZ2hsaWdodCByYW5nZSBvbiB0aGUgbGVmdCBmb3IgdGhlIGNob3NlbgorCSAqIGNsYXNzLCBkYXRhdHlwZSwgZW51bSwgb3IgbWFwZW50cnkKKwkgKi8KKwlwdWJsaWMgdm9pZCBoaWdobGlnaHRSYW5nZUZvclRvcExldmVsRGVjbChJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJX2VkaXRvci5yZXNldEhpZ2hsaWdodFJhbmdlKCk7CisJCUlUZXh0U2VsZWN0aW9uIHRzID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247CisJCS8qCisJCSAqIGhpZ2hsaWdodCB0aGUgYm9yZGVyIG9mIHRoZSB0b3AtbGV2ZWwgZGVjbGFyYXRpb24gYXQgdGhlIGN1cnNvciwgaWYKKwkJICogYW55CisJCSAqLworCQlpbnQgb2Zmc2V0ID0gdHMuZ2V0T2Zmc2V0KCk7CisJCWludCBsZW5ndGggPSB0cy5nZXRMZW5ndGgoKTsKKwkJQVNUTm9kZSBkZWNsQXRDdXJzb3IgPSBfZWRpdG9yLmdldENsb3Nlc3RFbmNsb3NpbmdBU1ROb2RlQXQob2Zmc2V0LCBsZW5ndGgsIFRvcExldmVsRGVjbC5jbGFzcyk7CisJCWlmICgoZGVjbEF0Q3Vyc29yICE9IG51bGwpICYmIGRlY2xBdEN1cnNvciBpbnN0YW5jZW9mIFRvcExldmVsRGVjbCkgeworCQkJX2VkaXRvci5zZXRIaWdobGlnaHRSYW5nZShkZWNsQXRDdXJzb3IuZ2V0UmFuZ2VTdGFydCgpLCBkZWNsQXRDdXJzb3IuZ2V0UmFuZ2VMZW5ndGgoKSwgZmFsc2UpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7CisJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247CisJCQloaWdobGlnaHRSYW5nZUZvclRvcExldmVsRGVjbCh0ZXh0U2VsZWN0aW9uKTsKKwkJCW1hcmtPY2N1cnJlbmNlcyh0ZXh0U2VsZWN0aW9uKTsKKwkJCXNlbGVjdEluT3V0bGluZSh0ZXh0U2VsZWN0aW9uKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzZWxlY3RJbk91dGxpbmUoSVRleHRTZWxlY3Rpb24gdHMpIHsKKwkJaW50IG9mZnNldCA9IHRzLmdldE9mZnNldCgpOworCQlpbnQgbGVuZ3RoID0gdHMuZ2V0TGVuZ3RoKCk7CisJCUVtZmF0aWNBU1ROb2RlIG4gPSBfZWRpdG9yLmdldENsb3Nlc3RFbmNsb3NpbmdBU1ROb2RlQXQob2Zmc2V0LCBsZW5ndGgsIE9iamVjdC5jbGFzcyk7CisJCUNvbXBVbml0IGNvbXBVbml0ID0gKENvbXBVbml0KSBfZWRpdG9yLmdldFBhcnNlUm9vdCgpOworCQlpZiAoY29tcFVuaXQgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCU1hcDxBU1ROb2RlLCBPdXRsaW5lTm9kZT4gYTJvID0gY29tcFVuaXQuZ2V0Q3N0Mk91dGxpbmUoKTsKKwkJT3V0bGluZU5vZGUgdG9IaWdobGlnaHQgPSBmaW5kT3V0bGluZU5vZGVGb3IobiwgYTJvKTsKKwkJaWYgKHRvSGlnaGxpZ2h0ID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlJU2VsZWN0aW9uIGN1cnJlbnRPdXRsaW5lU2VsZWN0aW9uID0gX2VkaXRvci5nZXRDb250ZW50T3V0bGluZVBhZ2UoKS5nZXRTZWxlY3Rpb24oKTsKKwkJT3V0bGluZU5vZGUgc2VsZWN0ZWQgPSBudWxsOworCQlpZiAoY3VycmVudE91dGxpbmVTZWxlY3Rpb24gaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uKSB7CisJCQlzZWxlY3RlZCA9IChPdXRsaW5lTm9kZSkgKChUcmVlU2VsZWN0aW9uKSBjdXJyZW50T3V0bGluZVNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCX0KKwkJYm9vbGVhbiBza2lwU2VsZWN0ID0gKHNlbGVjdGVkID09IHRvSGlnaGxpZ2h0KTsKKwkJaWYgKCFza2lwU2VsZWN0KSB7CisJCQlfZWRpdG9yLmdldENvbnRlbnRPdXRsaW5lUGFnZSgpLnNlbGVjdEZyb21FZGl0b3IodG9IaWdobGlnaHQpOworCQl9CisJfQorCisJcHJpdmF0ZSBPdXRsaW5lTm9kZSBmaW5kT3V0bGluZU5vZGVGb3IoQVNUTm9kZSBuLCBNYXA8QVNUTm9kZSwgT3V0bGluZU5vZGU+IGEybykgeworCQlpZiAoYTJvID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOyAKKwkJfQorCQlPdXRsaW5lTm9kZSByZXMgPSBhMm8uZ2V0KG4pOworCQlpZiAocmVzICE9IG51bGwpIHsKKwkJCXJldHVybiByZXM7CisJCX0KKwkJaWYgKG4gIT0gbnVsbCAmJiBuLmdldFBhcmVudCgpICE9IG51bGwpIHsKKwkJCXJlcyA9IGZpbmRPdXRsaW5lTm9kZUZvcihuLmdldFBhcmVudCgpLCBhMm8pOworCQkJcmV0dXJuIHJlczsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgbWFya09jY3VycmVuY2VzKElUZXh0U2VsZWN0aW9uIHRzKSB7CisJCXJlbW92ZU9jY3VycmVuY2VBbm5vdGF0aW9ucygpOworCQlpbnQgb2Zmc2V0ID0gdHMuZ2V0T2Zmc2V0KCk7CisJCWludCBsZW5ndGggPSB0cy5nZXRMZW5ndGgoKTsKKwkJQm91bmRFeGNlcHRXaWxkY2FyZCBjc3RVc2UgPSAoQm91bmRFeGNlcHRXaWxkY2FyZCkgX2VkaXRvci5nZXRDbG9zZXN0RW5jbG9zaW5nQVNUTm9kZUF0KG9mZnNldCwgbGVuZ3RoLAorCQkJCUJvdW5kRXhjZXB0V2lsZGNhcmQuY2xhc3MpOworCQlpZiAoY3N0VXNlID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlFT2JqZWN0IGVjb3JlRGVjbCA9IF9lZGl0b3IuZ2V0RWNvcmVEZWNsMkNzdFVzZSgpLmdldEludihjc3RVc2UuZ2V0UmF3VE5hbWVPclRWYXJPclBhcmFtemVkVE5hbWUoKSk7CisJCWlmIChlY29yZURlY2wgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCVNldDxBU1ROb2RlPiBvY2N1Tm9kZXMgPSBfZWRpdG9yLmdldEVjb3JlRGVjbDJDc3RVc2UoKS5nZXQoZWNvcmVEZWNsKTsKKwkJTWFwPEFubm90YXRpb24sIFBvc2l0aW9uPiBhbm5vdGF0aW9uTWFwID0gbmV3IEhhc2hNYXA8QW5ub3RhdGlvbiwgUG9zaXRpb24+KCk7CisJCWZvciAoQVNUTm9kZSBuIDogb2NjdU5vZGVzKSB7CisJCQlTdHJpbmcgbWVzc2FnZSA9ICIiOworCQkJUG9zaXRpb24gcG9zID0gbmV3IFBvc2l0aW9uKG4uZ2V0UmFuZ2VTdGFydCgpLCBuLmdldFJhbmdlTGVuZ3RoKCkpOworCQkJdHJ5IHsKKwkJCQltZXNzYWdlID0gX2VkaXRvci5nZXREb2N1bWVudCgpLmdldChwb3Mub2Zmc2V0LCBwb3MubGVuZ3RoKTsKKwkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQkJLy8gU2tpcCB0aGlzIG1hdGNoCisJCQkJY29udGludWU7CisJCQl9CisJCQlBbm5vdGF0aW9uIGFubiA9IG5ldyBBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS5qZHQudWkub2NjdXJyZW5jZXMiLCBmYWxzZSwgbWVzc2FnZSk7CisJCQlhbm5vdGF0aW9uTWFwLnB1dChhbm4sIHBvcyk7CisJCX0KKwkJSURvY3VtZW50UHJvdmlkZXIgZG9jdW1lbnRQcm92aWRlciA9IF9lZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOworCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBfZWRpdG9yLmdldERvY3VtZW50KCk7CisJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZG9jdW1lbnRQcm92aWRlci5nZXRBbm5vdGF0aW9uTW9kZWwoX2VkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKKwkJaWYgKGFubm90YXRpb25Nb2RlbCA9PSBudWxsKQorCQkJcmV0dXJuOworCQlPYmplY3QgbG9jayA9IGdldExvY2tPYmplY3QoZG9jdW1lbnQpOworCQlpZiAobG9jayA9PSBudWxsKSB7CisJCQl1cGRhdGVBbm5vdGF0aW9ucyhhbm5vdGF0aW9uTW9kZWwsIGFubm90YXRpb25NYXApOworCQl9IGVsc2UgeworCQkJc3luY2hyb25pemVkIChsb2NrKSB7CisJCQkJdXBkYXRlQW5ub3RhdGlvbnMoYW5ub3RhdGlvbk1vZGVsLCBhbm5vdGF0aW9uTWFwKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVBbm5vdGF0aW9ucyhJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCwgTWFwIGFubm90YXRpb25NYXApIHsKKwkJaWYgKGFubm90YXRpb25Nb2RlbCBpbnN0YW5jZW9mIElBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24pIHsKKwkJCSgoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgYW5ub3RhdGlvbk1vZGVsKS5yZXBsYWNlQW5ub3RhdGlvbnMoZk9jY3VycmVuY2VBbm5vdGF0aW9ucywgYW5ub3RhdGlvbk1hcCk7CisJCX0gZWxzZSB7CisJCQlyZW1vdmVPY2N1cnJlbmNlQW5ub3RhdGlvbnMoKTsKKwkJCUl0ZXJhdG9yIGl0ZXIgPSBhbm5vdGF0aW9uTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJCU1hcC5FbnRyeSBtYXBFbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworCQkJCWFubm90YXRpb25Nb2RlbC5hZGRBbm5vdGF0aW9uKChBbm5vdGF0aW9uKSBtYXBFbnRyeS5nZXRLZXkoKSwgKFBvc2l0aW9uKSBtYXBFbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlmT2NjdXJyZW5jZUFubm90YXRpb25zID0gKEFubm90YXRpb25bXSkgYW5ub3RhdGlvbk1hcC5rZXlTZXQoKS50b0FycmF5KAorCQkJCW5ldyBBbm5vdGF0aW9uW2Fubm90YXRpb25NYXAua2V5U2V0KCkuc2l6ZSgpXSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlbW92ZU9jY3VycmVuY2VBbm5vdGF0aW9ucygpIHsKKwkJSURvY3VtZW50UHJvdmlkZXIgZG9jdW1lbnRQcm92aWRlciA9IF9lZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOworCQlpZiAoZG9jdW1lbnRQcm92aWRlciA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBkb2N1bWVudFByb3ZpZGVyLmdldEFubm90YXRpb25Nb2RlbChfZWRpdG9yLmdldEVkaXRvcklucHV0KCkpOworCQlpZiAoYW5ub3RhdGlvbk1vZGVsID09IG51bGwgfHwgZk9jY3VycmVuY2VBbm5vdGF0aW9ucyA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSURvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRQcm92aWRlci5nZXREb2N1bWVudChfZWRpdG9yLmdldEVkaXRvcklucHV0KCkpOworCQlPYmplY3QgbG9jayA9IGdldExvY2tPYmplY3QoZG9jdW1lbnQpOworCQlpZiAobG9jayA9PSBudWxsKSB7CisJCQl1cGRhdGVBbm5vdGF0aW9uTW9kZWxGb3JSZW1vdmVzKGFubm90YXRpb25Nb2RlbCk7CisJCX0gZWxzZSB7CisJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKKwkJCQl1cGRhdGVBbm5vdGF0aW9uTW9kZWxGb3JSZW1vdmVzKGFubm90YXRpb25Nb2RlbCk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlQW5ub3RhdGlvbk1vZGVsRm9yUmVtb3ZlcyhJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCkgeworCQlpZiAoYW5ub3RhdGlvbk1vZGVsIGluc3RhbmNlb2YgSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgeworCQkJKChJQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uKSBhbm5vdGF0aW9uTW9kZWwpLnJlcGxhY2VBbm5vdGF0aW9ucyhmT2NjdXJyZW5jZUFubm90YXRpb25zLCBudWxsKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBmT2NjdXJyZW5jZUFubm90YXRpb25zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJYW5ub3RhdGlvbk1vZGVsLnJlbW92ZUFubm90YXRpb24oZk9jY3VycmVuY2VBbm5vdGF0aW9uc1tpXSk7CisJCQl9CisJCX0KKwkJZk9jY3VycmVuY2VBbm5vdGF0aW9ucyA9IG51bGw7CisJfQorCisJcHJpdmF0ZSBBbm5vdGF0aW9uW10gZk9jY3VycmVuY2VBbm5vdGF0aW9ucyA9IG51bGw7CisKKwkvKioKKwkgKiBJbnN0YWxscyB0aGlzIHNlbGVjdGlvbiBjaGFuZ2VkIGxpc3RlbmVyIHdpdGggdGhlIGdpdmVuIHNlbGVjdGlvbgorCSAqIHByb3ZpZGVyLiBJZiB0aGUgc2VsZWN0aW9uIHByb3ZpZGVyIGlzIGEgcG9zdCBzZWxlY3Rpb24gcHJvdmlkZXIsIHBvc3QKKwkgKiBzZWxlY3Rpb24gY2hhbmdlZCBldmVudHMgYXJlIHRoZSBwcmVmZXJyZWQgY2hvaWNlLCBvdGhlcndpc2Ugbm9ybWFsCisJICogc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnRzIGFyZSByZXF1ZXN0ZWQuCisJICogCisJICogQHBhcmFtIHNlbGVjdGlvblByb3ZpZGVyCisJICovCisJcHVibGljIHZvaWQgaW5zdGFsbChJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpIHsKKwkJaWYgKHNlbGVjdGlvblByb3ZpZGVyID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB7CisJCQlJUG9zdFNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHNlbGVjdGlvblByb3ZpZGVyOworCQkJcHJvdmlkZXIuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwkJfSBlbHNlIHsKKwkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhpcyBzZWxlY3Rpb24gY2hhbmdlZCBsaXN0ZW5lciBmcm9tIHRoZSBnaXZlbiBzZWxlY3Rpb24KKwkgKiBwcm92aWRlci4KKwkgKiAKKwkgKiBAcGFyYW0gc2VsZWN0aW9uUHJvdmlkZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bmluc3RhbGwoSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyKSB7CisJCWlmIChzZWxlY3Rpb25Qcm92aWRlciA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHNlbGVjdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgeworCQkJSVBvc3RTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBzZWxlY3Rpb25Qcm92aWRlcjsKKwkJCXByb3ZpZGVyLnJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCX0gZWxzZSB7CisJCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCX0KKwl9CisKKwlwcml2YXRlIE9iamVjdCBnZXRMb2NrT2JqZWN0KElEb2N1bWVudCBkb2MpIHsKKwkJT2JqZWN0IGxvY2sgPSBudWxsOworCQlpZiAoZG9jIGluc3RhbmNlb2YgSVN5bmNocm9uaXphYmxlKSB7CisJCQlsb2NrID0gKChJU3luY2hyb25pemFibGUpIGRvYykuZ2V0TG9ja09iamVjdCgpOworCQl9CisJCXJldHVybiBsb2NrOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvZWRpdG9yL0VtZmF0aWNLZXlMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvZWRpdG9yL0VtZmF0aWNLZXlMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzc1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY0tleUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuZWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY0tleUxpc3RlbmVyIGltcGxlbWVudHMgS2V5TGlzdGVuZXIgeworCisJcHJpdmF0ZSBFbWZhdGljRWRpdG9yIF9lZGl0b3IgPSBudWxsOworCisJcHVibGljIEVtZmF0aWNLZXlMaXN0ZW5lcihFbWZhdGljRWRpdG9yIGVtZmF0aWNFZGl0b3IpIHsKKwkJX2VkaXRvciAgPSBlbWZhdGljRWRpdG9yOyAKKwl9CisKKwlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKKwl9CisKKwlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJCisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY091dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY091dGxpbmVDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4YmVhZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9FbWZhdGljT3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUudXRpbC5FbWZhdGljT3V0bGluZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkub3V0bGluZS5FbWZhdGljQ29udGVudE91dGxpbmVQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLm91dGxpbmUuSU91dGxpbmVCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS51aS5vdXRsaW5lLkxEVENvbnRlbnRPdXRsaW5lUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUudWkub3V0bGluZS5MRFRPdXRsaW5lQ29uZmlndXJhdGlvbjsKKworcHVibGljIGNsYXNzIEVtZmF0aWNPdXRsaW5lQ29uZmlndXJhdGlvbiBleHRlbmRzIExEVE91dGxpbmVDb25maWd1cmF0aW9uIHsKKworCXByaXZhdGUgRW1mYXRpY0VkaXRvciBfZWRpdG9yOworCisJcHVibGljIEVtZmF0aWNPdXRsaW5lQ29uZmlndXJhdGlvbihFbWZhdGljRWRpdG9yIGVkaXRvcikgeworCQlzdXBlcihlZGl0b3IpOworCQlfZWRpdG9yID0gZWRpdG9yOworCX0KKworCXB1YmxpYyBJT3V0bGluZUJ1aWxkZXIgZ2V0T3V0bGluZUJ1aWxkZXIoKSB7CisJCXJldHVybiBuZXcgRW1mYXRpY091dGxpbmVCdWlsZGVyKCk7CisJfQorCisJcHVibGljIExEVENvbnRlbnRPdXRsaW5lUGFnZSBjcmVhdGVDb250ZW50T3V0bGluZVBhZ2UoKSB7CisJCXJldHVybiBuZXcgRW1mYXRpY0NvbnRlbnRPdXRsaW5lUGFnZShfZWRpdG9yKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY1NvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9FbWZhdGljU291cmNlVmlld2VyQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNWNjOGQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY1NvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDI1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5lZGl0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5wYXJzZXIuRW1mYXRpY1BhcnNlckRyaXZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5jb250ZW50YXNzaXN0LkNhc2NhZGVkQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5jb250ZW50YXNzaXN0LkVtZmF0aWNDb250ZW50QXNzaXN0UHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmNvbnRlbnRhc3Npc3QuRW1mYXRpY0tleXdvcmRDb250ZW50QXNzaXN0UHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmh5cGVybGlua3MuRW1mYXRpY0h5cGVybGlua0RldGVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnBhcnRpdGlvbi5FbWZhdGljUGFydGl0aW9uU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS50ZW1wbGF0ZXMuRW1mYXRpY0NvbnRleHRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnRlbXBsYXRlcy5FbWZhdGljVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLnBhcnNlci5JUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS51aS5lZGl0b3IuTERUQ29kZVNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLnVpLmVkaXRvci5MRFRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdEluZGVudExpbmVBdXRvRWRpdFN0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0YW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucHJlc2VudGF0aW9uLklQcmVzZW50YXRpb25SZWNvbmNpbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucHJlc2VudGF0aW9uLlByZXNlbnRhdGlvblJlY29uY2lsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5EZWZhdWx0RGFtYWdlclJlcGFpcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkRlZmF1bHRBbm5vdGF0aW9uSG92ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Ib3ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOworCisKK3B1YmxpYyBjbGFzcyBFbWZhdGljU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBleHRlbmRzCisJCUxEVFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24geworCisJRW1mYXRpY0NvZGVTY2FubmVyIF9lbWZhdGljQ29kZVNjYW5uZXIgPSBudWxsOworCUVtZmF0aWNFZGl0b3IgX2VkaXRvciA9IG51bGw7CisKKwlwdWJsaWMgRW1mYXRpY1NvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oRW1mYXRpY0VkaXRvciBlZGl0b3IpIHsKKwkJc3VwZXIoZWRpdG9yKTsKKwkJX2VkaXRvciA9IGVkaXRvcjsKKwkJX3RleHRIb3ZlciA9IG5ldyBFbWZhdGljVGV4dEhvdmVyKGVkaXRvcik7CisJfQorCisJcHVibGljIExEVENvZGVTY2FubmVyIGNyZWF0ZUNvZGVTY2FubmVyKCkgeworCQlpZiAoX2VtZmF0aWNDb2RlU2Nhbm5lciA9PSBudWxsKSB7CisJCQlfZW1mYXRpY0NvZGVTY2FubmVyID0gbmV3IEVtZmF0aWNDb2RlU2Nhbm5lcigpOworCQl9CisJCXJldHVybiBfZW1mYXRpY0NvZGVTY2FubmVyOworCX0KKworCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKKwkJcmV0dXJuIG5ldyBFbWZhdGljUGFyc2VyRHJpdmVyKCk7CisJfQorCisJcHVibGljIElUZXh0SG92ZXIgZ2V0VGV4dEhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLAorCQkJU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisJCXJldHVybiBfdGV4dEhvdmVyOworCX0KKworCXB1YmxpYyBJVGV4dEhvdmVyIGdldFRleHRIb3ZlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwKKwkJCVN0cmluZyBjb250ZW50VHlwZSwgaW50IHN0YXRlTWFzaykgeworCQlyZXR1cm4gX3RleHRIb3ZlcjsKKwl9CisKKwlwcml2YXRlIGZpbmFsIEVtZmF0aWNUZXh0SG92ZXIgX3RleHRIb3ZlcjsKKworCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7CisJCXJldHVybiBFbWZhdGljUGFydGl0aW9uU2Nhbm5lci5jb250ZW50VHlwZXMoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVByZXNlbnRhdGlvblJlY29uY2lsZXIgZ2V0UHJlc2VudGF0aW9uUmVjb25jaWxlcihJU291cmNlVmlld2VyIGFyZzApIHsKKwkJUHJlc2VudGF0aW9uUmVjb25jaWxlciByZWNvbmNpbGVyID0gbmV3IFByZXNlbnRhdGlvblJlY29uY2lsZXIoKTsKKwkJRGVmYXVsdERhbWFnZXJSZXBhaXJlciBkciA9IG5ldyBEZWZhdWx0RGFtYWdlclJlcGFpcmVyKAorCQkJCWNyZWF0ZUNvZGVTY2FubmVyKCkpOworCisJCS8qCisJCSAqIG1ha2Ugc3ludGF4IGNvbG9yaW5nIHdvcmsgZm9yIGFsbCBkb2N1bWVudCBwYXJ0aXRpb25zIGV4Y2VwdCB0aGUKKwkJICogY29tbWVudCBvbmVzCisJCSAqLworCisJCS8vIGkuZS4sIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRQorCQlyZWNvbmNpbGVyLnNldERhbWFnZXIoZHIsICJfX2RmdGxfcGFydGl0aW9uX2NvbnRlbnRfdHlwZSIpOworCQlyZWNvbmNpbGVyLnNldFJlcGFpcmVyKGRyLCAiX19kZnRsX3BhcnRpdGlvbl9jb250ZW50X3R5cGUiKTsKKworCQlzZXREUihyZWNvbmNpbGVyLCBkciwgRW1mYXRpY1BhcnRpdGlvblNjYW5uZXIucGFja2FnZVBhcnQpOworCQlzZXREUihyZWNvbmNpbGVyLCBkciwgRW1mYXRpY1BhcnRpdGlvblNjYW5uZXIuaW1wb3J0UGFydCk7CisJCXNldERSKHJlY29uY2lsZXIsIGRyLCBFbWZhdGljUGFydGl0aW9uU2Nhbm5lci5hbm5vdGF0aW9uUGFydCk7CisJCXNldERSKHJlY29uY2lsZXIsIGRyLCBFbWZhdGljUGFydGl0aW9uU2Nhbm5lci5zdWJQYWNrYWdlUGFydCk7CisJCXNldERSKHJlY29uY2lsZXIsIGRyLCBFbWZhdGljUGFydGl0aW9uU2Nhbm5lci5hdHRyUGFydCk7CisJCXNldERSKHJlY29uY2lsZXIsIGRyLCBFbWZhdGljUGFydGl0aW9uU2Nhbm5lci5yZWZQYXJ0KTsKKwkJc2V0RFIocmVjb25jaWxlciwgZHIsIEVtZmF0aWNQYXJ0aXRpb25TY2FubmVyLnZhbHJQYXJ0KTsKKwkJc2V0RFIocmVjb25jaWxlciwgZHIsIEVtZmF0aWNQYXJ0aXRpb25TY2FubmVyLm9wUGFydCk7CisJCXNldERSKHJlY29uY2lsZXIsIGRyLCBFbWZhdGljUGFydGl0aW9uU2Nhbm5lci5kYXRhdHlwZVBhcnQpOworCQlzZXREUihyZWNvbmNpbGVyLCBkciwgRW1mYXRpY1BhcnRpdGlvblNjYW5uZXIuZW51bVBhcnQpOworCQlzZXREUihyZWNvbmNpbGVyLCBkciwgRW1mYXRpY1BhcnRpdGlvblNjYW5uZXIubWFwZW50cnlQYXJ0KTsKKwkJc2V0RFIocmVjb25jaWxlciwgZHIsIEVtZmF0aWNQYXJ0aXRpb25TY2FubmVyLmNsYXNzSGVhZGluZ1BhcnQpOworCQlzZXREUihyZWNvbmNpbGVyLCBkciwgRW1mYXRpY1BhcnRpdGlvblNjYW5uZXIuaWZhY2VIZWFkaW5nUGFydCk7CisKKwkJcmV0dXJuIHJlY29uY2lsZXI7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldERSKFByZXNlbnRhdGlvblJlY29uY2lsZXIgcmVjb25jaWxlciwKKwkJCURlZmF1bHREYW1hZ2VyUmVwYWlyZXIgZHIsIFN0cmluZyBkb2NQYXJ0KSB7CisJCXJlY29uY2lsZXIuc2V0RGFtYWdlcihkciwgZG9jUGFydCk7CisJCXJlY29uY2lsZXIuc2V0UmVwYWlyZXIoZHIsIGRvY1BhcnQpOworCisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElBbm5vdGF0aW9uSG92ZXIgZ2V0QW5ub3RhdGlvbkhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7CisJCWlmIChfYW5ub3RhdGlvbkhvdmVyID09IG51bGwpIHsKKwkJCS8vIFRPRE8gdXNlIEhUTUxBbm5vdGF0aW9uSG92ZXIgaW5zdGVhZAorCQkJLy8gVE9ETyB1c2UgUHJvamVjdGlvbkFubm90YXRpb25Ib3ZlciBpbnN0ZWFkLCBzbyB0aGF0IHN1bW1hcml6aW5nIGFubm90YXRpb25zIGFyZSBzaG93bgorCQkJX2Fubm90YXRpb25Ib3ZlciA9IG5ldyBEZWZhdWx0QW5ub3RhdGlvbkhvdmVyKCk7CisJCX0KKwkJcmV0dXJuIF9hbm5vdGF0aW9uSG92ZXI7CisJfQorCisJRGVmYXVsdEFubm90YXRpb25Ib3ZlciBfYW5ub3RhdGlvbkhvdmVyID0gbnVsbDsKKworCS8qCisJICogaHlwZXJsaW5rcworCSAqIAorCSAqIGh0dHA6Ly9vcmFuZ2V2b2x0LmNvbS93b3JkcHJlc3MvYXJjaGl2ZXMvMjAwNS8wMS8wNS9ob3d0by1lbmFibGUtaHlwZXJsaW5raW5nLWluLXRleHQtZWRpdG9yLworCSAqIAorCSAqLworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiNnZXRIeXBlcmxpbmtEZXRlY3RvcnMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcikKKwkgKi8KKwlwdWJsaWMgSUh5cGVybGlua0RldGVjdG9yW10gZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7CisJCUlIeXBlcmxpbmtEZXRlY3RvcltdIGluaGVyaXRlZERldGVjdG9ycyA9IHN1cGVyCisJCQkJLmdldEh5cGVybGlua0RldGVjdG9ycyhzb3VyY2VWaWV3ZXIpOworCisJCWlmIChfZWRpdG9yID09IG51bGwpIHsKKwkJCXJldHVybiBpbmhlcml0ZWREZXRlY3RvcnM7CisJCX0KKworCQlpbnQgaW5oZXJpdGVkRGV0ZWN0b3JzTGVuZ3RoID0gaW5oZXJpdGVkRGV0ZWN0b3JzICE9IG51bGwgPyBpbmhlcml0ZWREZXRlY3RvcnMubGVuZ3RoCisJCQkJOiAwOworCQlJSHlwZXJsaW5rRGV0ZWN0b3JbXSBkZXRlY3RvcnMgPSBuZXcgSUh5cGVybGlua0RldGVjdG9yW2luaGVyaXRlZERldGVjdG9yc0xlbmd0aCArIDFdOworCQlkZXRlY3RvcnNbMF0gPSBuZXcgRW1mYXRpY0h5cGVybGlua0RldGVjdG9yKF9lZGl0b3IpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGluaGVyaXRlZERldGVjdG9yc0xlbmd0aDsgaSsrKSB7CisJCQlkZXRlY3RvcnNbaSArIDFdID0gaW5oZXJpdGVkRGV0ZWN0b3JzW2ldOworCQl9CisKKwkJcmV0dXJuIGRldGVjdG9yczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSUF1dG9FZGl0U3RyYXRlZ3lbXSBnZXRBdXRvRWRpdFN0cmF0ZWdpZXMoCisJCQlJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisJCUxpc3Q8SUF1dG9FZGl0U3RyYXRlZ3k+IHMgPSBuZXcgQXJyYXlMaXN0PElBdXRvRWRpdFN0cmF0ZWd5PigpOworCQlJQXV0b0VkaXRTdHJhdGVneVtdIHZvbk9iZW4gPSBzdXBlci5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLAorCQkJCWNvbnRlbnRUeXBlKTsKKwkJZm9yIChJQXV0b0VkaXRTdHJhdGVneSBhdXRvRWRpdFN0cmF0ZWd5IDogdm9uT2JlbikgeworCQkJcy5hZGQoYXV0b0VkaXRTdHJhdGVneSk7CisJCX0KKwkJcy5hZGQobmV3IERlZmF1bHRJbmRlbnRMaW5lQXV0b0VkaXRTdHJhdGVneSgpKTsKKwkJcy5hZGQobmV3IEVtZmF0aWNBdXRvRWRpdFN0cmF0ZWd5KF9lZGl0b3IpKTsKKwkJLy8gVE9ETyBhZGQgcGFydGl0aW9uIHR5cGUtc3BlY2lmaWMgYXV0byBlZGl0IHN0cmF0ZWdpZXMKKwkJSUF1dG9FZGl0U3RyYXRlZ3lbXSByZXMgPSBzLnRvQXJyYXkobmV3IElBdXRvRWRpdFN0cmF0ZWd5WzBdKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29udGVudEFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgeworCQlDb250ZW50QXNzaXN0YW50IGNhID0gbmV3IENvbnRlbnRBc3Npc3RhbnQoKTsKKwkJY2EuZW5hYmxlQXV0b0FjdGl2YXRpb24odHJ1ZSk7CisJCWNhLnNldEF1dG9BY3RpdmF0aW9uRGVsYXkoNTAwKTsKKwkJY2Euc2V0UHJvcG9zYWxQb3B1cE9yaWVudGF0aW9uKElDb250ZW50QXNzaXN0YW50LkNPTlRFWFRfSU5GT19CRUxPVyk7CisJCWNhCisJCQkJLnNldENvbnRleHRJbmZvcm1hdGlvblBvcHVwT3JpZW50YXRpb24oSUNvbnRlbnRBc3Npc3RhbnQuQ09OVEVYVF9JTkZPX0JFTE9XKTsKKwkJY2EKKwkJCQkuc2V0SW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcihnZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKHNvdXJjZVZpZXdlcikpOworCisJCUNhc2NhZGVkQ29udGVudEFzc2lzdFByb2Nlc3NvciBtYXN0ZXJDYXAgPSBuZXcgQ2FzY2FkZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7CisJCQorCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBjYXAgPSBuZXcgRW1mYXRpY1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigKKwkJCQlFbWZhdGljQ29udGV4dFR5cGUuRU1GQVRJQ19DT05URVhUX1RZUEUpOworCQltYXN0ZXJDYXAuYWRkKGNhcCk7CisJCXJlZ2lzdGVyRm9yQWxsRW1mYXRpY0NvbnRlbnRUeXBlcyhjYSwgbWFzdGVyQ2FwKTsKKworCQljYXAgPSBuZXcgRW1mYXRpY0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoX2VkaXRvcik7CisJCW1hc3RlckNhcC5hZGQoY2FwKTsKKwkJCisJCWNhcCA9IG5ldyBFbWZhdGljS2V5d29yZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoX2VkaXRvcik7CisJCW1hc3RlckNhcC5hZGQoY2FwKTsKKwkJCisJCXJldHVybiBjYTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVnaXN0ZXJGb3JBbGxFbWZhdGljQ29udGVudFR5cGVzKENvbnRlbnRBc3Npc3RhbnQgY2EsCisJCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBjYXApIHsKKwkJY2Euc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihjYXAsIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7CisKKwkJY2Euc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihjYXAsIEVtZmF0aWNQYXJ0aXRpb25TY2FubmVyLnBhY2thZ2VQYXJ0KTsKKwkJY2Euc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihjYXAsIEVtZmF0aWNQYXJ0aXRpb25TY2FubmVyLmltcG9ydFBhcnQpOworCQljYS5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNhcCwKKwkJCQlFbWZhdGljUGFydGl0aW9uU2Nhbm5lci5hbm5vdGF0aW9uUGFydCk7CisJCWNhLnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY2FwLAorCQkJCUVtZmF0aWNQYXJ0aXRpb25TY2FubmVyLnN1YlBhY2thZ2VQYXJ0KTsKKwkJY2Euc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihjYXAsIEVtZmF0aWNQYXJ0aXRpb25TY2FubmVyLmF0dHJQYXJ0KTsKKwkJY2Euc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihjYXAsIEVtZmF0aWNQYXJ0aXRpb25TY2FubmVyLnJlZlBhcnQpOworCQljYS5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNhcCwgRW1mYXRpY1BhcnRpdGlvblNjYW5uZXIudmFsclBhcnQpOworCQljYS5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNhcCwgRW1mYXRpY1BhcnRpdGlvblNjYW5uZXIub3BQYXJ0KTsKKwkJY2Euc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihjYXAsIEVtZmF0aWNQYXJ0aXRpb25TY2FubmVyLmRhdGF0eXBlUGFydCk7CisJCWNhLnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY2FwLCBFbWZhdGljUGFydGl0aW9uU2Nhbm5lci5lbnVtUGFydCk7CisJCWNhLnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY2FwLCBFbWZhdGljUGFydGl0aW9uU2Nhbm5lci5tYXBlbnRyeVBhcnQpOworCQljYS5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNhcCwKKwkJCQlFbWZhdGljUGFydGl0aW9uU2Nhbm5lci5jbGFzc0hlYWRpbmdQYXJ0KTsKKwkJY2Euc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihjYXAsCisJCQkJRW1mYXRpY1BhcnRpdGlvblNjYW5uZXIuaWZhY2VIZWFkaW5nUGFydCk7CisJCWNhLnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY2FwLAorCQkJCUVtZmF0aWNQYXJ0aXRpb25TY2FubmVyLm11bHRpTGluZUNvbW1lbnQpOworCQljYS5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNhcCwKKwkJCQlFbWZhdGljUGFydGl0aW9uU2Nhbm5lci5zaW5nbGVMaW5lQ29tbWVudCk7CisKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIElUZXh0RG91YmxlQ2xpY2tTdHJhdGVneSBnZXREb3VibGVDbGlja1N0cmF0ZWd5KAorCQkJSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBzdXBlci5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSUFubm90YXRpb25Ib3ZlciBnZXRPdmVydmlld1J1bGVyQW5ub3RhdGlvbkhvdmVyKAorCQkJSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gc3VwZXIuZ2V0T3ZlcnZpZXdSdWxlckFubm90YXRpb25Ib3Zlcihzb3VyY2VWaWV3ZXIpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9FbWZhdGljVGV4dEhvdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY1RleHRIb3Zlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MTY4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvRW1mYXRpY1RleHRIb3Zlci5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJhdG9yLmVjb3JlLlRva2VuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmdlbmVyYXRvci5lbWZhdGljLldyaXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5BYnN0cmFjdE1vZGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkNsYXNzS2luZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Db21wVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5FbWZhdGljQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5PcHROZWdhdGVkTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuUmVmZXJlbmNlS2luZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5UcmFuc2llbnRNb2RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLnV0aWwuRW1mYXRpY0tleXdvcmRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvci5FbWZhdGljRWRpdG9yLlJlZmVyZWRFY29yZURlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY1RleHRIb3ZlciBpbXBsZW1lbnRzIElUZXh0SG92ZXIgeworCisJRW1mYXRpY1RleHRIb3ZlcihFbWZhdGljRWRpdG9yIGVkaXRvcikgeworCQlfZWRpdG9yID0gZWRpdG9yOworCQlfaG92ZXJDbGFzc2VzID0gKG5ldyBDbGFzc1tdIHsgT3B0TmVnYXRlZE1vZGlmaWVyLmNsYXNzLAorCQkJCUFic3RyYWN0TW9kaWZpZXIuY2xhc3MsCisJCQkJQ2xhc3NLaW5kLmNsYXNzLAorCQkJCVRyYW5zaWVudE1vZGlmaWVyLmNsYXNzLAorCQkJCVJlZmVyZW5jZUtpbmQuY2xhc3MgfSk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRIb3ZlckluZm8oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgeworCQlpZiAoaG92ZXJSZWdpb24gIT0gbnVsbCkgeworCQkJQVNUTm9kZSByb290Tm9kZSA9IF9lZGl0b3IuZ2V0UGFyc2VSb290KCk7CisJCQlpZiAocm9vdE5vZGUgIT0gbnVsbCkgeworCQkJCS8qCisJCQkJICogaG92ZXJzIGZvciBtb2RpZmllcnMgQVNUTm9kZSBob3Zlck5vZGUgPQorCQkJCSAqIHJvb3ROb2RlLmdldE5vZGVBdChob3ZlclJlZ2lvbi5nZXRPZmZzZXQoKSwKKwkJCQkgKiBob3ZlclJlZ2lvbi5nZXRMZW5ndGgoKSwgX2hvdmVyQ2xhc3NlcywgdHJ1ZSk7IGlmIChob3Zlck5vZGUgIT0KKwkJCQkgKiBudWxsKSB7IHJldHVybiBnZXRIb3ZlckluZm8oaG92ZXJOb2RlKTsgfQorCQkJCSAqLworCQkJCUNvbXBVbml0IGNvbXBVbml0ID0gKENvbXBVbml0KSByb290Tm9kZTsKKwkJCQlTdHJpbmcgbXNnID0gdHJ5VHlwZUhvdmVyKGNvbXBVbml0LCBob3ZlclJlZ2lvbi5nZXRPZmZzZXQoKSk7CisJCQkJaWYgKG1zZyAhPSBudWxsKQorCQkJCQlyZXR1cm4gbXNnOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgU3RyaW5nIHRyeVR5cGVIb3ZlcihDb21wVW5pdCBjb21wVW5pdCwgaW50IG9mZnNldCkgeworCQlSZWZlcmVkRWNvcmVEZWNsIHJlZCA9IF9lZGl0b3IuZ2V0UmVmZXJlZEVjb3JlRGVjbChvZmZzZXQsIDApOworCQlpZiAocmVkID09IG51bGwgfHwgcmVkLm5vZGUgPT0gbnVsbCB8fCByZWQuZWNvcmVEZWNsID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUVPYmplY3QgZWNvcmVEZWNsID0gcmVkLmVjb3JlRGVjbDsKKwkJU3RyaW5nIG1zZyA9IFdyaXRlci5zdHJpbmdpZnkoZWNvcmVEZWNsKTsKKwkJcmV0dXJuIG1zZzsKKwl9CisKKwlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7CisJCXJldHVybiBuZXcgUmVnaW9uKG9mZnNldCwgMCk7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0SG92ZXJJbmZvKEFTVE5vZGUgaG92ZXJOb2RlKSB7CisJCWlmIChob3Zlck5vZGUgaW5zdGFuY2VvZiBPcHROZWdhdGVkTW9kaWZpZXIpIHsKKwkJCU9wdE5lZ2F0ZWRNb2RpZmllciBub2RlID0gKE9wdE5lZ2F0ZWRNb2RpZmllcikgaG92ZXJOb2RlOworCQkJU3RyaW5nIG1vZGlmaWVyVGV4dCA9IG5vZGUuZ2V0TW9kaWZpZXIoKS5nZXRUZXh0KCk7CisJCQlTdHJpbmcgaG92ZXJUZXh0ID0gRW1mYXRpY0tleXdvcmRzLkdldEhvdmVyVGV4dChtb2RpZmllclRleHQpOworCQkJcmV0dXJuIGNvbXBvc2VIb3ZlclRleHQoaG92ZXJUZXh0LCBub2RlLmdldEJhbmcoKSAhPSBudWxsLCBob3Zlck5vZGUpOworCQl9CisJCWlmIChob3Zlck5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE1vZGlmaWVyKSB7CisJCQlBYnN0cmFjdE1vZGlmaWVyIG5vZGUgPSAoQWJzdHJhY3RNb2RpZmllcikgaG92ZXJOb2RlOworCQkJU3RyaW5nIGhvdmVyVGV4dCA9IEVtZmF0aWNLZXl3b3Jkcy5HZXRIb3ZlclRleHQobm9kZS5nZXRBYnN0cmFjdF9LVygpLmdldFRleHQoKSk7CisJCQlyZXR1cm4gY29tcG9zZUhvdmVyVGV4dChob3ZlclRleHQsIGZhbHNlLCBob3Zlck5vZGUpOworCQl9CisJCWlmIChob3Zlck5vZGUgaW5zdGFuY2VvZiBDbGFzc0tpbmQpIHsKKwkJCVN0cmluZyBob3ZlclRleHQgPSBFbWZhdGljS2V5d29yZHMuR2V0SG92ZXJUZXh0KGhvdmVyTm9kZS5nZXRUZXh0KCkpOworCQkJcmV0dXJuIGNvbXBvc2VIb3ZlclRleHQoaG92ZXJUZXh0LCBmYWxzZSwgaG92ZXJOb2RlKTsKKwkJfQorCQlpZiAoaG92ZXJOb2RlIGluc3RhbmNlb2YgVHJhbnNpZW50TW9kaWZpZXIpIHsKKwkJCVN0cmluZyBob3ZlclRleHQgPSAiRURhdGFUeXBlLmlzU2VyaWFsaXphYmxlKCkgPT0gPEY+IjsKKwkJCXJldHVybiBjb21wb3NlSG92ZXJUZXh0KGhvdmVyVGV4dCwgZmFsc2UsIGhvdmVyTm9kZSk7CisJCX0KKwkJaWYgKGhvdmVyTm9kZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUtpbmQpIHsKKwkJCVN0cmluZyBob3ZlclRleHQgPSBFbWZhdGljS2V5d29yZHMuR2V0SG92ZXJUZXh0KGhvdmVyTm9kZS5nZXRUZXh0KCkpOworCQkJcmV0dXJuIGNvbXBvc2VIb3ZlclRleHQoaG92ZXJUZXh0LCBmYWxzZSwgaG92ZXJOb2RlKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgY29tcG9zZUhvdmVyVGV4dChTdHJpbmcgaG92ZXJUZXh0LCBib29sZWFuIGlzTmVnYXRlZCwgQVNUTm9kZSBob3Zlck5vZGUpIHsKKwkJaWYgKGhvdmVyVGV4dCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCVN0cmluZyBjb21wb3NlZFRleHQgPSBudWxsOworCQlpZiAoaG92ZXJUZXh0LmluZGV4T2YoIjxUPiIpICE9IC0xKSB7CisJCQlpZiAoIWlzTmVnYXRlZCkKKwkJCQljb21wb3NlZFRleHQgPSBob3ZlclRleHQucmVwbGFjZUZpcnN0KCI8VD4iLCAidHJ1ZSIpOworCQkJZWxzZQorCQkJCWNvbXBvc2VkVGV4dCA9IGhvdmVyVGV4dC5yZXBsYWNlRmlyc3QoIjxUPiIsICJmYWxzZSIpOworCQl9IGVsc2UgaWYgKGhvdmVyVGV4dC5pbmRleE9mKCI8Rj4iKSAhPSAtMSkKKwkJCWlmICghaXNOZWdhdGVkKQorCQkJCWNvbXBvc2VkVGV4dCA9IGhvdmVyVGV4dC5yZXBsYWNlRmlyc3QoIjxGPiIsICJmYWxzZSIpOworCQkJZWxzZQorCQkJCWNvbXBvc2VkVGV4dCA9IGhvdmVyVGV4dC5yZXBsYWNlRmlyc3QoIjxGPiIsICJ0cnVlIik7CisJCWlmIChjb21wb3NlZFRleHQgIT0gbnVsbCkgeworCQkJU3RyaW5nIHRva2VuVGV4dCA9IFRva2VuVGV4dC5HZXQoKEVtZmF0aWNBU1ROb2RlKSBob3Zlck5vZGUpOworCQkJcmV0dXJuICInIiArIHRva2VuVGV4dCArICInIG1lYW5zICIgKyBjb21wb3NlZFRleHQ7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXByaXZhdGUgZmluYWwgRW1mYXRpY0VkaXRvciBfZWRpdG9yOworCXByaXZhdGUgZmluYWwgQ2xhc3MgX2hvdmVyQ2xhc3Nlc1tdOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvZWRpdG9yL2FjdGlvbnMvRW1mYXRpY0VkaXRvckFjdGlvbk1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvYWN0aW9ucy9FbWZhdGljRWRpdG9yQWN0aW9uTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWUxZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvZWRpdG9yL2FjdGlvbnMvRW1mYXRpY0VkaXRvckFjdGlvbk1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvci5hY3Rpb25zOworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBFbWZhdGljRWRpdG9yQWN0aW9uTWVzc2FnZXMgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvci5hY3Rpb25zLkVtZmF0aWNFZGl0b3JBY3Rpb25NZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOworCisJcHJpdmF0ZSBFbWZhdGljRWRpdG9yQWN0aW9uTWVzc2FnZXMoKSB7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKKwkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGU7CisJfQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCXRyeSB7CisJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvYWN0aW9ucy9FbWZhdGljRWRpdG9yQWN0aW9uTWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9hY3Rpb25zL0VtZmF0aWNFZGl0b3JBY3Rpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTAxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvYWN0aW9ucy9FbWZhdGljRWRpdG9yQWN0aW9uTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDQyIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAgICBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIC0gYnVnIDQwMjU1CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK09wZW5EZWNsYXJhdGlvbkFjdGlvbi4wPSZPcGVuIERlY2xhcmF0aW9uCitPcGVuRGVjbGFyYXRpb25BY3Rpb24uMT1PcGVuIGFuIGVkaXRvciBvbiB0aGUgcmVmZXJlbmNlZCBlbGVtZW50CitPcGVuRXh0ZXJuYWxEb2NBY3Rpb24uMD1PcGVuIEV4dGVybmFsIEFudCBEb2N1bWVudGF0aW9uCitPcGVuRXh0ZXJuYWxEb2NBY3Rpb24uMT1PcGVuIEUmeHRlcm5hbCBEb2N1bWVudGF0aW9uCitPcGVuRXh0ZXJuYWxEb2NBY3Rpb24uMj1PcGVucyBhbiBleHRlcm5hbCBicm93c2VyIG9uIHRoZSByZWZlcmVuY2VkIEFudCBlbGVtZW50CisKK1RvZ2dsZVByZXNlbnRhdGlvbi5sYWJlbD1TaG93IFNvdXJjZSBvZiBTZWxlY3RlZCBFbGVtZW50IE9ubHkKK1RvZ2dsZVByZXNlbnRhdGlvbi50b29sdGlwPVNob3cgU291cmNlIG9mIFNlbGVjdGVkIEVsZW1lbnQgT25seQorCitUb2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb24ubGFiZWw9IFRvZ2dsZSBBbnQgTWFyayBPY2N1cnJlbmNlcworVG9nZ2xlTWFya09jY3VycmVuY2VzQWN0aW9uLnRvb2x0aXA9IFRvZ2dsZSBBbnQgTWFyayBPY2N1cnJlbmNlcworCitUb2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uLmxhYmVsPSBUb2dnbGUgQXV0byBSZWNvbmNpbGUKK1RvZ2dsZUF1dG9SZWNvbmNpbGVBY3Rpb24udG9vbHRpcD0gVG9nZ2xlIEF1dG8gcmVjb25jaWxlCisKK1Byb2plY3Rpb24uVG9nZ2xlLmxhYmVsPSAmRW5hYmxlIEZvbGRpbmcKK1Byb2plY3Rpb24uVG9nZ2xlLnRvb2x0aXA9IFRvZ2dsZXMgRm9sZGluZworUHJvamVjdGlvbi5Ub2dnbGUuZGVzY3JpcHRpb249IFRvZ2dsZXMgZm9sZGluZyBmb3IgdGhlIGN1cnJlbnQgZWRpdG9yCisKK1Byb2plY3Rpb24uRXhwYW5kQWxsLmxhYmVsPSBFeHBhbmQgJkFsbAorUHJvamVjdGlvbi5FeHBhbmRBbGwudG9vbHRpcD0gRXhwYW5kcyBBbGwgRm9sZGVkIFJlZ2lvbnMKK1Byb2plY3Rpb24uRXhwYW5kQWxsLmRlc2NyaXB0aW9uPSBFeHBhbmRzIGFueSBmb2xkZWQgcmVnaW9ucyBpbiB0aGUgY3VycmVudCBlZGl0b3IKKworUnVuVG9MaW5lQWRhcHRlci4wPUVtcHR5IGVkaXRvcgorUnVuVG9MaW5lQWRhcHRlci4xPU1pc3NpbmcgZG9jdW1lbnQKK1J1blRvTGluZUFkYXB0ZXIuMj1ObyBmaWxlIGNvdWxkIGJlIGZvdW5kCitSdW5Ub0xpbmVBZGFwdGVyLjM9VW5hYmxlIHRvIGxvY2F0ZSBkZWJ1ZyB0YXJnZXQKK1JlbmFtZUluRmlsZUFjdGlvbi4wPVJlJm5hbWUgSW4gRmlsZQorUmVuYW1lSW5GaWxlQWN0aW9uLjE9UmVuYW1lcyBhbGwgcmVmZXJlbmNlcyB3aXRoaW4gdGhlIHNhbWUgYnVpbGRmaWxlCitSZW5hbWVJbkZpbGVBY3Rpb24uMj1SZW5hbWVzIGFsbCByZWZlcmVuY2VzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvYWN0aW9ucy9PcGVuRGVjbGFyYXRpb25BY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2VkaXRvci9hY3Rpb25zL09wZW5EZWNsYXJhdGlvbkFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YmRmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9lZGl0b3IvYWN0aW9ucy9PcGVuRGVjbGFyYXRpb25BY3Rpb24uamF2YQpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5lZGl0b3IuYWN0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuZWRpdG9yLkVtZmF0aWNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLk9wZW5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuY29tbWFuZHMuQWN0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLklIYW5kbGVyU2VydmljZTsKKworcHVibGljIGNsYXNzIE9wZW5EZWNsYXJhdGlvbkFjdGlvbiBleHRlbmRzIE9wZW5BY3Rpb24geworCisJcHJpdmF0ZSBFbWZhdGljRWRpdG9yIF9lZGl0b3I7CisKKwlwdWJsaWMgT3BlbkRlY2xhcmF0aW9uQWN0aW9uKEVtZmF0aWNFZGl0b3IgZWRpdG9yKSB7CisJCXN1cGVyKGVkaXRvci5nZXRTaXRlKCkpOworCQlfZWRpdG9yID0gZWRpdG9yOworCQlzZXRBY3Rpb25EZWZpbml0aW9uSWQoSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLk9QRU5fRURJVE9SKTsKKwkJSUhhbmRsZXJTZXJ2aWNlIGhhbmRsZXJTZXJ2ZXIgPSAoSUhhbmRsZXJTZXJ2aWNlKSBlZGl0b3IuZ2V0U2l0ZSgpCisJCQkJLmdldFNlcnZpY2UoSUhhbmRsZXJTZXJ2aWNlLmNsYXNzKTsKKwkJaGFuZGxlclNlcnZlci5hY3RpdmF0ZUhhbmRsZXIoCisJCQkJSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLk9QRU5fRURJVE9SLCBuZXcgQWN0aW9uSGFuZGxlcigKKwkJCQkJCXRoaXMpKTsKKworCQlzZXRUZXh0KEVtZmF0aWNFZGl0b3JBY3Rpb25NZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIk9wZW5EZWNsYXJhdGlvbkFjdGlvbi4wIikpOyAvLyROT04tTkxTLTEkCisJCXNldERlc2NyaXB0aW9uKEVtZmF0aWNFZGl0b3JBY3Rpb25NZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIk9wZW5EZWNsYXJhdGlvbkFjdGlvbi4xIikpOyAvLyROT04tTkxTLTEkCisJCXNldFRvb2xUaXBUZXh0KEVtZmF0aWNFZGl0b3JBY3Rpb25NZXNzYWdlcworCQkJCS5nZXRTdHJpbmcoIk9wZW5EZWNsYXJhdGlvbkFjdGlvbi4xIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJaWYgKF9lZGl0b3IgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJRU9iamVjdCBvcGVuZWREZWNsID0gX2VkaXRvci5nb3RvRGVjbGFyYXRpb24oKTsKKworCQlpZiAob3BlbmVkRGVjbCBpbnN0YW5jZW9mIEVDbGFzcykgeworCisJCQlfZWRpdG9yLnNob3dJblR5cGVIaWVyYXJjaHkoKEVDbGFzcykgb3BlbmVkRGVjbCk7CisJCX0KKworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24jc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCXNldEVuYWJsZWQoX2VkaXRvciAhPSBudWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFZGl0b3IoRW1mYXRpY0VkaXRvciBlZGl0b3IpIHsKKwkJX2VkaXRvciA9IGVkaXRvcjsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9oeXBlcmxpbmtzL0VtZmF0aWNIeXBlcmxpbmsuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL2h5cGVybGlua3MvRW1mYXRpY0h5cGVybGluay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDBlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9oeXBlcmxpbmtzL0VtZmF0aWNIeXBlcmxpbmsuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5oeXBlcmxpbmtzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW1mYXRpY0FTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuZWRpdG9yLkVtZmF0aWNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7CisKK3B1YmxpYyBjbGFzcyBFbWZhdGljSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7CisKKyAgICBwcml2YXRlIElSZWdpb24gZlJlZ2lvbj0gbnVsbDsKKyAgICBwcml2YXRlIEVtZmF0aWNBU1ROb2RlIGZMaW5rVGFyZ2V0PSBudWxsOworICAgIHByaXZhdGUgRW1mYXRpY0VkaXRvciBmRWRpdG9yPSBudWxsOworICAgIAorICAgIHB1YmxpYyBFbWZhdGljSHlwZXJsaW5rKEVtZmF0aWNFZGl0b3IgZWRpdG9yLCBJUmVnaW9uIHJlZ2lvbiwgRW1mYXRpY0FTVE5vZGUgbGlua1RhcmdldCkgeworICAgICAgICAKKyAgICAgICBmUmVnaW9uPSByZWdpb247CisgICAgICAgZkxpbmtUYXJnZXQ9IGxpbmtUYXJnZXQ7CisgICAgICAgZkVkaXRvcj0gZWRpdG9yOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rUmVnaW9uKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7CisgICAgICAgIHJldHVybiBmUmVnaW9uOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCisgICAgICovCisgICAgcHVibGljIHZvaWQgb3BlbigpIHsKKyAgICAgICAgZkVkaXRvci5vcGVuVGFyZ2V0KGZMaW5rVGFyZ2V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9oeXBlcmxpbmtzL0VtZmF0aWNIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvaHlwZXJsaW5rcy9FbWZhdGljSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTE2MTFlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvaHlwZXJsaW5rcy9FbWZhdGljSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5oeXBlcmxpbmtzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkNsYXNzRGVjbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5EYXRhVHlwZURlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW1mYXRpY0FTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW51bURlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5UeXBlUGFyYW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuZWRpdG9yLkVtZmF0aWNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuZWRpdG9yLkVtZmF0aWNFZGl0b3IuUmVmZXJlZEVjb3JlRGVjbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKKworcHVibGljIGNsYXNzIEVtZmF0aWNIeXBlcmxpbmtEZXRlY3RvciBpbXBsZW1lbnRzIElIeXBlcmxpbmtEZXRlY3RvciB7CisKKwlwcml2YXRlIEVtZmF0aWNFZGl0b3IgX2VkaXRvcjsKKworCXB1YmxpYyBFbWZhdGljSHlwZXJsaW5rRGV0ZWN0b3IoRW1mYXRpY0VkaXRvciBlZGl0b3IpIHsKKwkJX2VkaXRvciA9IGVkaXRvcjsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvciNkZXRlY3RIeXBlcmxpbmtzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCisJICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24sIGJvb2xlYW4pCisJICovCisJcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpIHsKKwkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlSZWZlcmVkRWNvcmVEZWNsIHJlZCA9IF9lZGl0b3IuZ2V0UmVmZXJlZEVjb3JlRGVjbChyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7CisJCWlmIChyZWQgPT0gbnVsbCB8fCByZWQubm9kZSA9PSBudWxsIHx8IHJlZC5lY29yZURlY2wgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7IAorCQl9CisJCUVPYmplY3QgZWNvcmVEZWNsID0gcmVkLmVjb3JlRGVjbDsKKwkJRW1mYXRpY0FTVE5vZGUgbm9kZSA9IHJlZC5ub2RlOworCQlFbWZhdGljQVNUTm9kZSBsYW5kaW5nUGxhY2UgPSBnZXRMYW5kaW5nUGxhY2UoZWNvcmVEZWNsLCBfZWRpdG9yKTsKKwkJaWYgKGxhbmRpbmdQbGFjZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsgCisJCX0KKwkJSVJlZ2lvbiB1bmRlcmxpbmVSZWdpb24gPSBuZXcgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb24obm9kZS5nZXRSYW5nZVN0YXJ0KCksIG5vZGUuZ2V0UmFuZ2VMZW5ndGgoKSk7CisJCXJldHVybiBuZXcgSUh5cGVybGlua1tdIHsgbmV3IEVtZmF0aWNIeXBlcmxpbmsoX2VkaXRvciwgdW5kZXJsaW5lUmVnaW9uLCBsYW5kaW5nUGxhY2UpIH07CisJfQorCisJcHVibGljIHN0YXRpYyBFbWZhdGljQVNUTm9kZSBnZXRMYW5kaW5nUGxhY2UoRU9iamVjdCBlY29yZURlY2wsIEVtZmF0aWNFZGl0b3IgZWRpdG9yKSB7CisJCUFTVE5vZGUgY3N0RGVjbCA9IGVkaXRvci5nZXRDc3REZWNsMkVjb3JlQVNUKCkuZ2V0SW52KGVjb3JlRGVjbCk7CisJCWlmIChjc3REZWNsID09IG51bGwgfHwgIShjc3REZWNsIGluc3RhbmNlb2YgRW1mYXRpY0FTVE5vZGUpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlFbWZhdGljQVNUTm9kZSBsYW5kaW5nUGxhY2UgPSAoRW1mYXRpY0FTVE5vZGUpIGNzdERlY2w7CisJCWlmIChjc3REZWNsIGluc3RhbmNlb2YgQ2xhc3NEZWNsKSB7CisJCQlsYW5kaW5nUGxhY2UgPSAoKENsYXNzRGVjbCkgY3N0RGVjbCkuZ2V0TmFtZSgpOworCQl9CisJCWlmIChjc3REZWNsIGluc3RhbmNlb2YgRGF0YVR5cGVEZWNsKSB7CisJCQlsYW5kaW5nUGxhY2UgPSAoKERhdGFUeXBlRGVjbCkgY3N0RGVjbCkuZ2V0TmFtZSgpOworCQl9CisJCWlmIChjc3REZWNsIGluc3RhbmNlb2YgRW51bURlY2wpIHsKKwkJCWxhbmRpbmdQbGFjZSA9ICgoRW51bURlY2wpIGNzdERlY2wpLmdldE5hbWUoKTsKKwkJfQorCQlpZiAoY3N0RGVjbCBpbnN0YW5jZW9mIFR5cGVQYXJhbSkgeworCQkJbGFuZGluZ1BsYWNlID0gKChUeXBlUGFyYW0pIGNzdERlY2wpLmdldFR5cGVWYXJOYW1lKCk7CisJCX0KKwkJaWYgKGNzdERlY2wgaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHsKKwkJCWxhbmRpbmdQbGFjZSA9ICgoUmVmZXJlbmNlKSBjc3REZWNsKS5nZXROYW1lKCk7CisJCX0KKwkJaWYgKGNzdERlY2wgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKKwkJCWxhbmRpbmdQbGFjZSA9ICgoQXR0cmlidXRlKSBjc3REZWNsKS5nZXROYW1lKCk7CisJCX0KKwkJaWYgKGNzdERlY2wgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKKwkJCWxhbmRpbmdQbGFjZSA9ICgoT3BlcmF0aW9uKSBjc3REZWNsKS5nZXROYW1lKCk7CisJCX0KKwkJcmV0dXJuIGxhbmRpbmdQbGFjZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL291dGxpbmUvQW5uRmlsdGVyQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9vdXRsaW5lL0FubkZpbHRlckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMzA2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9vdXRsaW5lL0FubkZpbHRlckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLm91dGxpbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKKworcHVibGljIGNsYXNzIEFubkZpbHRlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJcHJpdmF0ZSBBbm5vdGF0aW9uRmlsdGVyIF9maWx0ZXI7CisJcHJpdmF0ZSBUcmVlVmlld2VyIF90cmVlVmlld2VyOworCisJcHVibGljIEFubkZpbHRlckFjdGlvbihTdHJpbmcgc3RyaW5nLCBpbnQgYXNDaGVja0JveCwgQW5ub3RhdGlvbkZpbHRlciBhbm5GaWx0ZXIsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgeworCQlzdXBlcihzdHJpbmcsIGFzQ2hlY2tCb3gpOworCQlfZmlsdGVyID0gYW5uRmlsdGVyOworCQlfdHJlZVZpZXdlciA9IHRyZWVWaWV3ZXI7CisJfQorCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlpZiAoaXNDaGVja2VkKCkpIHsKKwkJCXNldFRleHQoIlNob3cgQW5ub3RhdGlvbnMiKTsKKwkJCXNldFRvb2xUaXBUZXh0KCJTaG93IEFubm90YXRpb25zIik7CisJCQlpZiAoX2ZpbHRlciA9PSBudWxsKSB7CisJCQkJX2ZpbHRlciA9IG5ldyBBbm5vdGF0aW9uRmlsdGVyKCk7CisJCQl9CisJCQlfdHJlZVZpZXdlci5hZGRGaWx0ZXIoX2ZpbHRlcik7CisJCQkvLyBUT0RPIGF2b2lkIGZsaWNrZXIKKwkJCV90cmVlVmlld2VyLmV4cGFuZEFsbCgpOworCQl9IGVsc2UgeworCQkJc2V0VGV4dCgiSGlkZSBBbm5vdGF0aW9ucyIpOworCQkJc2V0VG9vbFRpcFRleHQoIkhpZGUgQW5ub3RhdGlvbnMiKTsKKwkJCV90cmVlVmlld2VyLnJlbW92ZUZpbHRlcihfZmlsdGVyKTsKKwkJCS8vIFRPRE8gYXZvaWQgZmxpY2tlcgorCQkJX3RyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL291dGxpbmUvQW5ub3RhdGlvbkZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9Bbm5vdGF0aW9uRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3MGNhZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL291dGxpbmUvQW5ub3RhdGlvbkZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLm91dGxpbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Bbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LktleUVxdWFsc1ZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLm91dGxpbmUuT3V0bGluZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7CisKK3B1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPdXRsaW5lTm9kZSkgeworCQkJT3V0bGluZU5vZGUgb24gPSAoT3V0bGluZU5vZGUpIGVsZW1lbnQ7CisJCQlBU1ROb2RlIGFuID0gb24uZ2V0QVNUTm9kZSgpOyAKKwkJCWlmIChpc0Fubk9yS2V5VmFsdWUoYW4pKSB7CisJCQkJcmV0dXJuIGZhbHNlOyAKKwkJCX0KKwkJfQorCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE91dGxpbmVOb2RlKSB7CisJCQlPdXRsaW5lTm9kZSBwbiA9IChPdXRsaW5lTm9kZSkgcGFyZW50RWxlbWVudDsKKwkJCUFTVE5vZGUgYXAgPSBwbi5nZXRBU1ROb2RlKCk7CisJCQlpZiAoaXNBbm5PcktleVZhbHVlKGFwKSkgeworCQkJCXJldHVybiBmYWxzZTsgCisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzQW5uT3JLZXlWYWx1ZShBU1ROb2RlIG4pIHsKKwkJYm9vbGVhbiByZXMgPSAobiBpbnN0YW5jZW9mIEFubm90YXRpb24gfHwgbiBpbnN0YW5jZW9mIEtleUVxdWFsc1ZhbHVlKSA7IAorCQlyZXR1cm4gcmVzOworCX0KKwkKKwkKKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9BdHRyRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9vdXRsaW5lL0F0dHJGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzk5YjZkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9BdHRyRmlsdGVyLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkub3V0bGluZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5vdXRsaW5lLk91dGxpbmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOworCisKK3B1YmxpYyBjbGFzcyBBdHRyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPdXRsaW5lTm9kZSkgeworCQkJT3V0bGluZU5vZGUgb24gPSAoT3V0bGluZU5vZGUpIGVsZW1lbnQ7CisJCQlBU1ROb2RlIGFuID0gb24uZ2V0QVNUTm9kZSgpOworCQkJaWYgKGFuIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJLy8gYWN0dWFsbHkgdGhlIG5vZGUgaW4gdGhlIG91dGxpbmUgaXMgdGhlIG5hbWUsIGkuZS4KKwkJCS8vIEF0dHJpYnV0ZSNnZXROYW1lKCkKKwkJCWlmIChhbi5nZXRQYXJlbnQoKSAhPSBudWxsICYmIGFuLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9BdHRyRmlsdGVyQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9vdXRsaW5lL0F0dHJGaWx0ZXJBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjNhMDhhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9BdHRyRmlsdGVyQWN0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkub3V0bGluZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworCitwdWJsaWMgY2xhc3MgQXR0ckZpbHRlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJcHJpdmF0ZSBBdHRyRmlsdGVyIF9maWx0ZXI7CisJcHJpdmF0ZSBUcmVlVmlld2VyIF90cmVlVmlld2VyOworCisJcHVibGljIEF0dHJGaWx0ZXJBY3Rpb24oU3RyaW5nIHN0cmluZywgaW50IGFzQ2hlY2tCb3gsIEF0dHJGaWx0ZXIgZmlsdGVyLCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKKwkJc3VwZXIoc3RyaW5nLCBhc0NoZWNrQm94KTsKKwkJX2ZpbHRlciA9IGZpbHRlcjsKKwkJX3RyZWVWaWV3ZXIgPSB0cmVlVmlld2VyOworCX0KKworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJaWYgKGlzQ2hlY2tlZCgpKSB7CisJCQlzZXRUZXh0KCJTaG93IEF0dHJpYnV0ZXMiKTsKKwkJCXNldFRvb2xUaXBUZXh0KCJTaG93IEF0dHJpYnV0ZXMiKTsKKwkJCWlmIChfZmlsdGVyID09IG51bGwpIHsKKwkJCQlfZmlsdGVyID0gbmV3IEF0dHJGaWx0ZXIoKTsKKwkJCX0KKwkJCV90cmVlVmlld2VyLmFkZEZpbHRlcihfZmlsdGVyKTsKKwkJCS8vIFRPRE8gYXZvaWQgZmxpY2tlcgorCQkJX3RyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7CisJCX0gZWxzZSB7CisJCQlzZXRUZXh0KCJIaWRlIEF0dHJpYnV0ZXMiKTsKKwkJCXNldFRvb2xUaXBUZXh0KCJIaWRlIEF0dHJpYnV0ZXMiKTsKKwkJCV90cmVlVmlld2VyLnJlbW92ZUZpbHRlcihfZmlsdGVyKTsKKwkJCS8vIFRPRE8gYXZvaWQgZmxpY2tlcgorCQkJX3RyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL291dGxpbmUvRW1mYXRpY0NvbnRlbnRPdXRsaW5lUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9FbWZhdGljQ29udGVudE91dGxpbmVQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzNjBkMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL291dGxpbmUvRW1mYXRpY0NvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCkBAIC0wLDAgKzEsMzI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5vdXRsaW5lOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQ2xhc3NEZWNsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLkVtZmF0aWNVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5lZGl0b3IuRW1mYXRpY0VkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5vdXRsaW5lLk91dGxpbmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS51aS5vdXRsaW5lLkxEVENvbnRlbnRPdXRsaW5lUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlU2l0ZTsKKworcHVibGljIGNsYXNzIEVtZmF0aWNDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBMRFRDb250ZW50T3V0bGluZVBhZ2UgeworCisJcHJpdmF0ZSBFbWZhdGljRWRpdG9yIF9lZGl0b3IgPSBudWxsOworCisJcHJpdmF0ZSBBY3Rpb24gYW5uRmlsdGVyQWN0aW9uOworCXByaXZhdGUgQW5ub3RhdGlvbkZpbHRlciBhbm5GaWx0ZXI7CisKKwlwcml2YXRlIEFjdGlvbiBhdHRyRmlsdGVyQWN0aW9uOworCXByaXZhdGUgQXR0ckZpbHRlciBhdHRyRmlsdGVyOworCisJcHJpdmF0ZSBBY3Rpb24gcmVmRmlsdGVyQWN0aW9uOworCXByaXZhdGUgUmVmRmlsdGVyIHJlZkZpbHRlcjsKKworCXByaXZhdGUgQWN0aW9uIG9wRmlsdGVyQWN0aW9uOworCXByaXZhdGUgT3BGaWx0ZXIgb3BGaWx0ZXI7CisKKwlwcml2YXRlIEFjdGlvbiB0eXBlUGFyYW1GaWx0ZXJBY3Rpb247CisJcHJpdmF0ZSBUeXBlUGFyYW1GaWx0ZXIgdHlwZVBhcmFtRmlsdGVyOworCisJcHJpdmF0ZSBBY3Rpb24gZk9wZW5JblR5cGVIaWVyYXJjaHk7CisKKwlwcml2YXRlIE1lbnUgZk1lbnU7CisKKwlwdWJsaWMgRW1mYXRpY0NvbnRlbnRPdXRsaW5lUGFnZShFbWZhdGljRWRpdG9yIF9lZGl0b3IpIHsKKwkJc3VwZXIoX2VkaXRvcik7CisJCXRoaXMuX2VkaXRvciA9IF9lZGl0b3I7CisJCV9lZGl0b3Iuc2V0Q29udGVudE91dGxpbmVQYWdlKHRoaXMpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7CisJCW1ha2VGaWx0ZXJBY3Rpb25zKCk7CisJCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRTaXRlKCkuZ2V0QWN0aW9uQmFycygpOworCQlJVG9vbEJhck1hbmFnZXIgbWFuYWdlciA9IGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKKwkJbWFuYWdlci5hZGQoYW5uRmlsdGVyQWN0aW9uKTsKKwkJbWFuYWdlci5hZGQoYXR0ckZpbHRlckFjdGlvbik7CisJCW1hbmFnZXIuYWRkKHJlZkZpbHRlckFjdGlvbik7CisJCW1hbmFnZXIuYWRkKG9wRmlsdGVyQWN0aW9uKTsKKwkJbWFuYWdlci5hZGQodHlwZVBhcmFtRmlsdGVyQWN0aW9uKTsKKwkJLy8gYWxsb3dzIGV4dGVybmFsIGNvbnRyaWJ1dGlvbnMKKwkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOworCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQkvLyBUT0RPIGRlY29yYXRvcgorCQkvLyBnZXRUcmVlVmlld2VyKCkuc2V0TGFiZWxQcm92aWRlcihjcmVhdGVPdXRsaW5lTGFiZWxQcm92aWRlRGVjb3JhdGVkKCkpOworCisJCXBvcHVsYXRlQ29udGV4dE1lbnUoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb250ZXh0TWVudSgpIHsKKwkJZk9wZW5JblR5cGVIaWVyYXJjaHkgPSBuZXcgQWN0aW9uKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCU91dGxpbmVOb2RlIGVsZW1lbnQgPSBnZXRTZWxlY3RlZE5vZGUoKTsKKwkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7CisJCQkJCWlmIChlbGVtZW50LmdldEFTVE5vZGUoKSAhPSBudWxsKSB7CisJCQkJCQlpZiAoZWxlbWVudC5nZXRBU1ROb2RlKCkgaW5zdGFuY2VvZiBDbGFzc0RlY2wpIHsKKwkJCQkJCQlDbGFzc0RlY2wgY2QgPSAoQ2xhc3NEZWNsKSBlbGVtZW50LmdldEFTVE5vZGUoKTsKKwkJCQkJCQlFT2JqZWN0IGVPID0gX2VkaXRvci5nZXRDc3REZWNsMkVjb3JlQVNUKCkuZ2V0KGNkKTsKKwkJCQkJCQlpZiAoZU8gIT0gbnVsbCAmJiAoZU8gaW5zdGFuY2VvZiBFQ2xhc3MpKSB7CisJCQkJCQkJCV9lZGl0b3Iuc2hvd0luVHlwZUhpZXJhcmNoeSgoRUNsYXNzKSBlTyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCQorCQkJfQorCQl9OworCQlmT3BlbkluVHlwZUhpZXJhcmNoeS5zZXRUZXh0KCJmT3BlbkluVHlwZUhpZXJhcmNoeSIpOworCQlmT3BlbkluVHlwZUhpZXJhcmNoeS5zZXRUb29sVGlwVGV4dCgiZk9wZW5JblR5cGVIaWVyYXJjaHkiKTsKKwkJZk9wZW5JblR5cGVIaWVyYXJjaHkuc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKKwkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAorCQkJCQkJSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSykpOworCisJCS8vIHNlZSBBbnRFZGl0b3IgYW5kIHAuIDQ3MCBvbiBKREdFIDJuZCBFZC4KKwkJVHJlZVZpZXdlciB2aWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7CisJCU1lbnVNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCisJCW1hbmFnZXIuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOworCQltYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKwkJCQljb250ZXh0TWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKKwkJCX0KKwkJfSk7CisJCWZNZW51ID0gbWFuYWdlci5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0VHJlZSgpKTsKKwkJdmlld2VyLmdldFRyZWUoKS5zZXRNZW51KGZNZW51KTsKKworCQlJUGFnZVNpdGUgc2l0ZSA9IGdldFNpdGUoKTsKKwkJc2l0ZS5yZWdpc3RlckNvbnRleHRNZW51KAorCQkJCSJvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5vdXRsaW5lIiwgbWFuYWdlciwgdmlld2VyKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBJTGFiZWxQcm92aWRlciBjcmVhdGVPdXRsaW5lTGFiZWxQcm92aWRlRGVjb3JhdGVkKCkgeworCQkvLyBJTGFiZWxQcm92aWRlciBsZHRPTFAgPSAoSUxhYmVsUHJvdmlkZXIpCisJCS8vIGdldFRyZWVWaWV3ZXIoKS5nZXRMYWJlbFByb3ZpZGVyKCk7CisJCS8vIElMYWJlbERlY29yYXRvciBkZWNvcmF0b3IgPSBuZXcgRW1mYXRpY0xhYmVsRGVjb3JhdG9yKCk7CisJCS8vIERlY29yYXRpbmdMYWJlbFByb3ZpZGVyIGRlY29yYXRlZE9MUCA9IG5ldworCQkvLyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihsZHRPTFAsIGRlY29yYXRvcik7CisJCS8vIHJldHVybiBkZWNvcmF0ZWRPTFA7CisJCXJldHVybiBudWxsOworCX0KKworCXZvaWQgbWFrZUZpbHRlckFjdGlvbnMoKSB7CisKKwkJYW5uRmlsdGVyQWN0aW9uID0gbmV3IEFubkZpbHRlckFjdGlvbigiU2hvdyBBbm5vdGF0aW9ucyIsCisJCQkJSUFjdGlvbi5BU19DSEVDS19CT1gsIGFubkZpbHRlciwgZ2V0VHJlZVZpZXdlcigpKTsKKwkJYW5uRmlsdGVyQWN0aW9uLnNldFRleHQoIkhpZGUgQW5ub3RhdGlvbnMiKTsKKwkJYW5uRmlsdGVyQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJIaWRlIEFubm90YXRpb25zIik7CisJCS8vIEltYWdlIGFubkltZyA9IEVtZmF0aWNPdXRsaW5lQnVpbGRlci5nZXRBbm5vdGF0aW9uSW1hZ2UoKTsKKwkJSW1hZ2VEZXNjcmlwdG9yIGlkID0gZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbUljb25zRm9sZGVyKCJIaWRlRUFubm90YXRpb25zLmdpZiIpOworCQlhbm5GaWx0ZXJBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGlkKTsKKworCQlhdHRyRmlsdGVyQWN0aW9uID0gbmV3IEF0dHJGaWx0ZXJBY3Rpb24oIlNob3cgQXR0cmlidXRlcyIsCisJCQkJSUFjdGlvbi5BU19DSEVDS19CT1gsIGF0dHJGaWx0ZXIsIGdldFRyZWVWaWV3ZXIoKSk7CisJCWF0dHJGaWx0ZXJBY3Rpb24uc2V0VGV4dCgiSGlkZSBBdHRyaWJ1dGVzIik7CisJCWF0dHJGaWx0ZXJBY3Rpb24uc2V0VG9vbFRpcFRleHQoIkhpZGUgQXR0cmlidXRlcyIpOworCQlpZCA9IGdldEltYWdlRGVzY3JpcHRvckZyb21JY29uc0ZvbGRlcigiSGlkZUVBdHRyaWJ1dGVzLmdpZiIpOworCQlhdHRyRmlsdGVyQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihpZCk7CisKKwkJcmVmRmlsdGVyQWN0aW9uID0gbmV3IFJlZkZpbHRlckFjdGlvbigiU2hvdyBSZWZlcmVuY2VzIiwKKwkJCQlJQWN0aW9uLkFTX0NIRUNLX0JPWCwgcmVmRmlsdGVyLCBnZXRUcmVlVmlld2VyKCkpOworCQlyZWZGaWx0ZXJBY3Rpb24uc2V0VGV4dCgiSGlkZSBSZWZlcmVuY2VzIik7CisJCXJlZkZpbHRlckFjdGlvbi5zZXRUb29sVGlwVGV4dCgiSGlkZSBSZWZlcmVuY2VzIik7CisJCWlkID0gZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbUljb25zRm9sZGVyKCJIaWRlRVJlZmVyZW5jZXMuZ2lmIik7CisJCXJlZkZpbHRlckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoaWQpOworCisJCW9wRmlsdGVyQWN0aW9uID0gbmV3IE9wRmlsdGVyQWN0aW9uKCJTaG93IE9wZXJhdGlvbnMiLAorCQkJCUlBY3Rpb24uQVNfQ0hFQ0tfQk9YLCBvcEZpbHRlciwgZ2V0VHJlZVZpZXdlcigpKTsKKwkJb3BGaWx0ZXJBY3Rpb24uc2V0VGV4dCgiSGlkZSBPcGVyYXRpb25zIik7CisJCW9wRmlsdGVyQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJIaWRlIE9wZXJhdGlvbnMiKTsKKwkJaWQgPSBnZXRJbWFnZURlc2NyaXB0b3JGcm9tSWNvbnNGb2xkZXIoIkhpZGVFT3BlcmF0aW9ucy5naWYiKTsKKwkJb3BGaWx0ZXJBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGlkKTsKKworCQl0eXBlUGFyYW1GaWx0ZXJBY3Rpb24gPSBuZXcgVHlwZVBhcmFtRmlsdGVyQWN0aW9uKCJTaG93IFR5cGUgUGFyYW1zIiwKKwkJCQlJQWN0aW9uLkFTX0NIRUNLX0JPWCwgdHlwZVBhcmFtRmlsdGVyLCBnZXRUcmVlVmlld2VyKCkpOworCQl0eXBlUGFyYW1GaWx0ZXJBY3Rpb24uc2V0VGV4dCgiSGlkZSBUeXBlIFBhcmFtcyIpOworCQl0eXBlUGFyYW1GaWx0ZXJBY3Rpb24uc2V0VG9vbFRpcFRleHQoIkhpZGUgVHlwZSBQYXJhbXMiKTsKKwkJaWQgPSBnZXRJbWFnZURlc2NyaXB0b3JGcm9tSWNvbnNGb2xkZXIoIkhpZGVFVHlwZVBhcmFtZXRlcnMuZ2lmIik7CisJCXR5cGVQYXJhbUZpbHRlckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoaWQpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBuYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgaWNvbiBmaWxlCisJICogQHJldHVybiBhbiBJbWFnZQorCSAqLworCXN0YXRpYyBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2VGcm9tSWNvbnNGb2xkZXIoU3RyaW5nIG5hbWUpIHsKKwkJU3RyaW5nIGljb25QYXRoID0gImljb25zLyI7CisJCXRyeSB7CisJCQlVUkwgaW5zdGFsbFVSTCA9IEVtZmF0aWNVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoCisJCQkJCSIvIik7CisJCQlVUkwgdXJsID0gbmV3IFVSTChpbnN0YWxsVVJMLCBpY29uUGF0aCArIG5hbWUpOworCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvcgorCQkJCQkuY3JlYXRlRnJvbVVSTCh1cmwpOworCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKKwkJCXJldHVybiBpbWFnZTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIG5hbWUKKwkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBpY29uIGZpbGUKKwkgKiBAcmV0dXJuIGFuIEltYWdlCisJICovCisJc3RhdGljIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbUljb25zRm9sZGVyKFN0cmluZyBuYW1lKSB7CisJCVN0cmluZyBpY29uUGF0aCA9ICJpY29ucy8iOworCQl0cnkgeworCQkJVVJMIGluc3RhbGxVUkwgPSBFbWZhdGljVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KAorCQkJCQkiLyIpOworCQkJVVJMIHVybCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgaWNvblBhdGggKyBuYW1lKTsKKwkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IKKwkJCQkJLmNyZWF0ZUZyb21VUkwodXJsKTsKKwkJCXJldHVybiBpbWFnZURlc2NyaXB0b3I7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIHNob3dpbmdBbm5vdGF0aW9ucygpIHsKKwkJcmV0dXJuICFhbm5GaWx0ZXJBY3Rpb24uaXNDaGVja2VkKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2hvd2luZ0F0dHJpYnV0ZXMoKSB7CisJCXJldHVybiAhYXR0ckZpbHRlckFjdGlvbi5pc0NoZWNrZWQoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzaG93aW5nT3BlcmF0aW9ucygpIHsKKwkJcmV0dXJuICFvcEZpbHRlckFjdGlvbi5pc0NoZWNrZWQoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzaG93aW5nUmVmZXJlbmNlcygpIHsKKwkJcmV0dXJuICFyZWZGaWx0ZXJBY3Rpb24uaXNDaGVja2VkKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2hvd2luZ1R5cGVQYXJhbXMoKSB7CisJCXJldHVybiAhdHlwZVBhcmFtRmlsdGVyQWN0aW9uLmlzQ2hlY2tlZCgpOworCX0KKworCXB1YmxpYyB2b2lkIHNlbGVjdEZyb21FZGl0b3IoT3V0bGluZU5vZGUgdG9IaWdobGlnaHQpIHsKKwkJaWYgKHRvSGlnaGxpZ2h0ICE9IG51bGwpIHsKKwkJCUFTVE5vZGUgYXN0Tm9kZSA9IHRvSGlnaGxpZ2h0LmdldEFTVE5vZGUoKTsKKwkJCU91dGxpbmVOb2RlIG91dGxpbmVSb290ID0gbnVsbDsKKwkJCVRyZWVJdGVtIHJvb3QgPSBnZXRUcmVlVmlld2VyKCkuZ2V0VHJlZSgpLmdldFRvcEl0ZW0oKTsKKwkJCU9iamVjdCByb290RGF0YSA9IHJvb3QuZ2V0RGF0YSgpOworCQkJaWYgKHJvb3REYXRhIGluc3RhbmNlb2YgT3V0bGluZU5vZGUpIHsKKwkJCQlvdXRsaW5lUm9vdCA9IChPdXRsaW5lTm9kZSkgcm9vdERhdGE7CisJCQkJd2hpbGUgKG91dGxpbmVSb290LmdldFBhcmVudCgpICE9IG51bGwpIHsKKwkJCQkJb3V0bGluZVJvb3QgPSBvdXRsaW5lUm9vdC5nZXRQYXJlbnQoKTsKKwkJCQl9CisJCQl9CisJCQl0b0hpZ2hsaWdodCA9IGZpbmRPdXRsaW5lTm9kZUZvckFTVE5vZGUob3V0bGluZVJvb3QsIGFzdE5vZGUpOworCQkJVHJlZVZpZXdlciB2aWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7CisJCQl2aWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0b0hpZ2hsaWdodCksIHRydWUpOworCQkJLy8gVE9ETyB0aGlzIHNob3VsZCBiZSBhIHByZWZlcmVuY2U6CisJCQl2aWV3ZXIucmV2ZWFsKHRvSGlnaGxpZ2h0KTsKKwkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCX0KKwl9CisKKwlwcml2YXRlIE91dGxpbmVOb2RlIGZpbmRPdXRsaW5lTm9kZUZvckFTVE5vZGUoT3V0bGluZU5vZGUgbm9kZUluVHJlZSwKKwkJCUFTVE5vZGUgYXN0Tm9kZSkgeworCQlpZiAobm9kZUluVHJlZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlBU1ROb2RlIHRyZWVBU1ROb2RlID0gbm9kZUluVHJlZS5nZXRBU1ROb2RlKCk7CisJCWlmICh0cmVlQVNUTm9kZSA9PSBhc3ROb2RlKSB7CisJCQlyZXR1cm4gbm9kZUluVHJlZTsKKwkJfQorCQlpZiAobm9kZUluVHJlZS5nZXRDaGlsZHJlbigpICE9IG51bGwpIHsKKwkJCWZvciAoT3V0bGluZU5vZGUgb3V0bGluZUNoaWxkIDogbm9kZUluVHJlZS5nZXRDaGlsZHJlbigpKSB7CisJCQkJT3V0bGluZU5vZGUgY2FuZGlkYXRlID0gZmluZE91dGxpbmVOb2RlRm9yQVNUTm9kZShvdXRsaW5lQ2hpbGQsCisJCQkJCQlhc3ROb2RlKTsKKwkJCQlpZiAoY2FuZGlkYXRlICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIGNhbmRpZGF0ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNvbnRleHRNZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7CisJCWlmIChzZWxlY3Rpb25Jc0VDbGFzcygpKSB7CisJCQltZW51TWFuYWdlci5hZGQoZk9wZW5JblR5cGVIaWVyYXJjaHkpOworCQl9CisJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHNlbGVjdGlvbklzRUNsYXNzKCkgeworCQlPdXRsaW5lTm9kZSBvID0gZ2V0U2VsZWN0ZWROb2RlKCk7CisJCWlmIChvLmdldEFTVE5vZGUoKSAhPSBudWxsKSB7CisJCQlpZiAoby5nZXRBU1ROb2RlKCkgaW5zdGFuY2VvZiBDbGFzc0RlY2wpIHsKKwkJCQlDbGFzc0RlY2wgY2QgPSAoQ2xhc3NEZWNsKSBvLmdldEFTVE5vZGUoKTsKKwkJCQlFT2JqZWN0IGVPID0gX2VkaXRvci5nZXRDc3REZWNsMkVjb3JlQVNUKCkuZ2V0KGNkKTsKKwkJCQlpZiAoZU8gIT0gbnVsbCAmJiAoZU8gaW5zdGFuY2VvZiBFQ2xhc3MpKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBPdXRsaW5lTm9kZSBnZXRTZWxlY3RlZE5vZGUoKSB7CisJCUlTZWxlY3Rpb24gaXNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOworCQlpZiAoaXNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGlzZWxlY3Rpb247CisJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7CisJCQkJT2JqZWN0IHNlbGVjdGVkID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOworCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIE91dGxpbmVOb2RlKSB7CisJCQkJCXJldHVybiAoT3V0bGluZU5vZGUpIHNlbGVjdGVkOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL291dGxpbmUvT3BGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL291dGxpbmUvT3BGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQ4OTliCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9PcEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLm91dGxpbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5PcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUub3V0bGluZS5PdXRsaW5lTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKKworcHVibGljIGNsYXNzIE9wRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPdXRsaW5lTm9kZSkgeworCQkJT3V0bGluZU5vZGUgb24gPSAoT3V0bGluZU5vZGUpIGVsZW1lbnQ7CisJCQlBU1ROb2RlIGFuID0gb24uZ2V0QVNUTm9kZSgpOworCQkJaWYgKGFuIGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJLy8gYWN0dWFsbHkgdGhlIG5vZGUgaW4gdGhlIG91dGxpbmUgaXMgdGhlIG5hbWUsIGkuZS4KKwkJCS8vIEF0dHJpYnV0ZSNnZXROYW1lKCkKKwkJCWlmIChhbi5nZXRQYXJlbnQoKSAhPSBudWxsICYmIGFuLmdldFBhcmVudCgpIGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9PcEZpbHRlckFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9PcEZpbHRlckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OGI4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9vdXRsaW5lL09wRmlsdGVyQWN0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkub3V0bGluZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworCitwdWJsaWMgY2xhc3MgT3BGaWx0ZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCXByaXZhdGUgT3BGaWx0ZXIgX2ZpbHRlcjsKKwlwcml2YXRlIFRyZWVWaWV3ZXIgX3RyZWVWaWV3ZXI7CisKKwlwdWJsaWMgT3BGaWx0ZXJBY3Rpb24oU3RyaW5nIHN0cmluZywgaW50IGFzQ2hlY2tCb3gsIE9wRmlsdGVyIGZpbHRlciwgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7CisJCXN1cGVyKHN0cmluZywgYXNDaGVja0JveCk7CisJCV9maWx0ZXIgPSBmaWx0ZXI7CisJCV90cmVlVmlld2VyID0gdHJlZVZpZXdlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWlmIChpc0NoZWNrZWQoKSkgeworCQkJc2V0VGV4dCgiU2hvdyBPcGVyYXRpb25zIik7CisJCQlzZXRUb29sVGlwVGV4dCgiU2hvdyBPcGVyYXRpb25zIik7CisJCQlpZiAoX2ZpbHRlciA9PSBudWxsKSB7CisJCQkJX2ZpbHRlciA9IG5ldyBPcEZpbHRlcigpOworCQkJfQorCQkJX3RyZWVWaWV3ZXIuYWRkRmlsdGVyKF9maWx0ZXIpOworCQkJLy8gVE9ETyBhdm9pZCBmbGlja2VyCisJCQlfdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKKwkJfSBlbHNlIHsKKwkJCXNldFRleHQoIkhpZGUgT3BlcmF0aW9ucyIpOworCQkJc2V0VG9vbFRpcFRleHQoIkhpZGUgT3BlcmF0aW9ucyIpOworCQkJX3RyZWVWaWV3ZXIucmVtb3ZlRmlsdGVyKF9maWx0ZXIpOworCQkJLy8gVE9ETyBhdm9pZCBmbGlja2VyCisJCQlfdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9SZWZGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL291dGxpbmUvUmVmRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3ZmEzYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL291dGxpbmUvUmVmRmlsdGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkub3V0bGluZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0LlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5hc3QuQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5neW1uYXN0LnJ1bnRpbWUuY29yZS5vdXRsaW5lLk91dGxpbmVOb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOworCitwdWJsaWMgY2xhc3MgUmVmRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPdXRsaW5lTm9kZSkgeworCQkJT3V0bGluZU5vZGUgb24gPSAoT3V0bGluZU5vZGUpIGVsZW1lbnQ7CisJCQlBU1ROb2RlIGFuID0gb24uZ2V0QVNUTm9kZSgpOworCQkJaWYgKGFuIGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJLy8gYWN0dWFsbHkgdGhlIG5vZGUgaW4gdGhlIG91dGxpbmUgaXMgdGhlIG5hbWUsIGkuZS4KKwkJCS8vIEF0dHJpYnV0ZSNnZXROYW1lKCkKKwkJCWlmIChhbi5nZXRQYXJlbnQoKSAhPSBudWxsICYmIGFuLmdldFBhcmVudCgpIGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9SZWZGaWx0ZXJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL291dGxpbmUvUmVmRmlsdGVyQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0NDZkMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL291dGxpbmUvUmVmRmlsdGVyQWN0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkub3V0bGluZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworCitwdWJsaWMgY2xhc3MgUmVmRmlsdGVyQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwlwcml2YXRlIFJlZkZpbHRlciBfZmlsdGVyOworCXByaXZhdGUgVHJlZVZpZXdlciBfdHJlZVZpZXdlcjsKKworCXB1YmxpYyBSZWZGaWx0ZXJBY3Rpb24oU3RyaW5nIHN0cmluZywgaW50IGFzQ2hlY2tCb3gsIFJlZkZpbHRlciBmaWx0ZXIsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgeworCQlzdXBlcihzdHJpbmcsIGFzQ2hlY2tCb3gpOworCQlfZmlsdGVyID0gZmlsdGVyOworCQlfdHJlZVZpZXdlciA9IHRyZWVWaWV3ZXI7CisJfQorCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlpZiAoaXNDaGVja2VkKCkpIHsKKwkJCXNldFRleHQoIlNob3cgUmVmZXJlbmNlcyIpOworCQkJc2V0VG9vbFRpcFRleHQoIlNob3cgUmVmZXJlbmNlcyIpOworCQkJaWYgKF9maWx0ZXIgPT0gbnVsbCkgeworCQkJCV9maWx0ZXIgPSBuZXcgUmVmRmlsdGVyKCk7CisJCQl9CisJCQlfdHJlZVZpZXdlci5hZGRGaWx0ZXIoX2ZpbHRlcik7CisJCQkvLyBUT0RPIGF2b2lkIGZsaWNrZXIKKwkJCV90cmVlVmlld2VyLmV4cGFuZEFsbCgpOworCQl9IGVsc2UgeworCQkJc2V0VGV4dCgiSGlkZSBSZWZlcmVuY2VzIik7CisJCQlzZXRUb29sVGlwVGV4dCgiSGlkZSBSZWZlcmVuY2VzIik7CisJCQlfdHJlZVZpZXdlci5yZW1vdmVGaWx0ZXIoX2ZpbHRlcik7CisJCQkvLyBUT0RPIGF2b2lkIGZsaWNrZXIKKwkJCV90cmVlVmlld2VyLmV4cGFuZEFsbCgpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9vdXRsaW5lL1R5cGVQYXJhbUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9UeXBlUGFyYW1GaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmU2OTM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvb3V0bGluZS9UeXBlUGFyYW1GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5vdXRsaW5lOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuVHlwZVBhcmFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmd5bW5hc3QucnVudGltZS5jb3JlLm91dGxpbmUuT3V0bGluZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7CisKK3B1YmxpYyBjbGFzcyBUeXBlUGFyYW1GaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgeworCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgeworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE91dGxpbmVOb2RlKSB7CisJCQlPdXRsaW5lTm9kZSBvbiA9IChPdXRsaW5lTm9kZSkgZWxlbWVudDsKKwkJCUFTVE5vZGUgYW4gPSBvbi5nZXRBU1ROb2RlKCk7CisJCQlpZiAoYW4gaW5zdGFuY2VvZiBUeXBlUGFyYW0pIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlpZiAoYW4uZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiBhbi5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFR5cGVQYXJhbSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL291dGxpbmUvVHlwZVBhcmFtRmlsdGVyQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9vdXRsaW5lL1R5cGVQYXJhbUZpbHRlckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMmM4OWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9vdXRsaW5lL1R5cGVQYXJhbUZpbHRlckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLm91dGxpbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKKworcHVibGljIGNsYXNzIFR5cGVQYXJhbUZpbHRlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJcHJpdmF0ZSBUeXBlUGFyYW1GaWx0ZXIgX2ZpbHRlcjsKKwlwcml2YXRlIFRyZWVWaWV3ZXIgX3RyZWVWaWV3ZXI7CisKKwlwdWJsaWMgVHlwZVBhcmFtRmlsdGVyQWN0aW9uKFN0cmluZyBzdHJpbmcsIGludCBhc0NoZWNrQm94LCBUeXBlUGFyYW1GaWx0ZXIgZmlsdGVyLCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKKwkJc3VwZXIoc3RyaW5nLCBhc0NoZWNrQm94KTsKKwkJX2ZpbHRlciA9IGZpbHRlcjsKKwkJX3RyZWVWaWV3ZXIgPSB0cmVlVmlld2VyOworCX0KKworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJaWYgKGlzQ2hlY2tlZCgpKSB7CisJCQlzZXRUZXh0KCJTaG93IFR5cGUgUGFyYW1zIik7CisJCQlzZXRUb29sVGlwVGV4dCgiU2hvdyBUeXBlIFBhcmFtcyIpOworCQkJaWYgKF9maWx0ZXIgPT0gbnVsbCkgeworCQkJCV9maWx0ZXIgPSBuZXcgVHlwZVBhcmFtRmlsdGVyKCk7CisJCQl9CisJCQlfdHJlZVZpZXdlci5hZGRGaWx0ZXIoX2ZpbHRlcik7CisJCQkvLyBUT0RPIGF2b2lkIGZsaWNrZXIKKwkJCV90cmVlVmlld2VyLmV4cGFuZEFsbCgpOworCQl9IGVsc2UgeworCQkJc2V0VGV4dCgiSGlkZSBUeXBlIFBhcmFtcyIpOworCQkJc2V0VG9vbFRpcFRleHQoIkhpZGUgVHlwZSBQYXJhbXMiKTsKKwkJCV90cmVlVmlld2VyLnJlbW92ZUZpbHRlcihfZmlsdGVyKTsKKwkJCS8vIFRPRE8gYXZvaWQgZmxpY2tlcgorCQkJX3RyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3BhcnRpdGlvbi9EZWJ1Z1BhcnRpdGlvbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wYXJ0aXRpb24vRGVidWdQYXJ0aXRpb25lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYjhhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wYXJ0aXRpb24vRGVidWdQYXJ0aXRpb25lci5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnBhcnRpdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5GYXN0UGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JUGFydGl0aW9uVG9rZW5TY2FubmVyOworCisvKioKKyAqIFNpbXBsZSBleHRlbnNpb24gb2YgRGVmYXVsdFBhcnRpdGlvbmVyIHdpdGggcHJpbnRQYXJ0aXRpb25zKCkgbWV0aG9kIHRvIGFzc2lzdCB3aXRoIHByaW50aW5nIG91dCBwYXJ0aXRpb24KKyAqIGluZm9ybWF0aW9uCisgKiAKKyAqLworcHVibGljIGNsYXNzIERlYnVnUGFydGl0aW9uZXIgZXh0ZW5kcyBGYXN0UGFydGl0aW9uZXIKK3sKKworCXB1YmxpYyBEZWJ1Z1BhcnRpdGlvbmVyKElQYXJ0aXRpb25Ub2tlblNjYW5uZXIgc2Nhbm5lciwgU3RyaW5nW10gbGVnYWxDb250ZW50VHlwZXMpCisJeworCQlzdXBlcihzY2FubmVyLCBsZWdhbENvbnRlbnRUeXBlcyk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBpbmNsdWRlWmVyb0xlbmd0aFBhcnRpdGlvbnMpCisJeworCQlyZXR1cm4gc3VwZXIuY29tcHV0ZVBhcnRpdGlvbmluZyhvZmZzZXQsIGxlbmd0aCwgaW5jbHVkZVplcm9MZW5ndGhQYXJ0aXRpb25zKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBkZWxheUluaXRpYWxpemF0aW9uKQorCXsKKwkJc3VwZXIuY29ubmVjdChkb2N1bWVudCwgZGVsYXlJbml0aWFsaXphdGlvbik7CisJCXByaW50UGFydGl0aW9ucyhkb2N1bWVudCk7CisJfQorCisJcHVibGljIHZvaWQgcHJpbnRQYXJ0aXRpb25zKElEb2N1bWVudCBkb2N1bWVudCkKKwl7CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKwkJSVR5cGVkUmVnaW9uW10gcGFydGl0aW9ucyA9IGNvbXB1dGVQYXJ0aXRpb25pbmcoMCwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbnMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXRyeQorCQkJeworCQkJCVN0cmluZyB0ZXh0ID0gZG9jdW1lbnQuZ2V0KHBhcnRpdGlvbnNbaV0uZ2V0T2Zmc2V0KCksIHBhcnRpdGlvbnNbaV0uZ2V0TGVuZ3RoKCkpOworCQkJCVN0cmluZ1tdIGxpbmVzID0gdGV4dC5zcGxpdCgiXG4iKTsKKwkJCQlTdHJpbmcgbmV3VGV4dCA9ICIiOyAKKwkJCQlmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKKwkJCQkJaWYgKCFsaW5lLnRyaW0oKS5lcXVhbHMoIiIpKSB7CisJCQkJCQluZXdUZXh0ICs9IGxpbmUgKyAiXG4iOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghbmV3VGV4dC50cmltKCkuZXF1YWxzKCIiKSkgeworCQkJCQlidWZmZXIuYXBwZW5kKCJQYXJ0aXRpb24gdHlwZTogIiArIHBhcnRpdGlvbnNbaV0uZ2V0VHlwZSgpICsgIiwgb2Zmc2V0OiAiICsgcGFydGl0aW9uc1tpXS5nZXRPZmZzZXQoKQorCQkJCQkJCSsgIiwgbGVuZ3RoOiAiICsgcGFydGl0aW9uc1tpXS5nZXRMZW5ndGgoKSArICJcbiIpOworCQkJCQlidWZmZXIuYXBwZW5kKG5ld1RleHQpOworCQkJCQlidWZmZXIuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQkJCX0KKwkJCX0KKwkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKQorCQkJeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKwkJU3lzdGVtLm91dC5wcmludChidWZmZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wYXJ0aXRpb24vRW1mYXRpY0RvY3VtZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3BhcnRpdGlvbi9FbWZhdGljRG9jdW1lbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDNlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wYXJ0aXRpb24vRW1mYXRpY0RvY3VtZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5wYXJ0aXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5GaWxlRG9jdW1lbnRQcm92aWRlcjsKKworcHVibGljIGNsYXNzIEVtZmF0aWNEb2N1bWVudFByb3ZpZGVyIGV4dGVuZHMgRmlsZURvY3VtZW50UHJvdmlkZXIgeworCisJcHJvdGVjdGVkIElEb2N1bWVudCBjcmVhdGVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzdXBlci5jcmVhdGVEb2N1bWVudChlbGVtZW50KTsKKwkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKKwkJCUlEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gbmV3IERlYnVnUGFydGl0aW9uZXIobmV3IEVtZmF0aWNQYXJ0aXRpb25TY2FubmVyKCksCisJCQkJCUVtZmF0aWNQYXJ0aXRpb25TY2FubmVyLmNvbnRlbnRUeXBlcygpKTsKKwkJCXBhcnRpdGlvbmVyLmNvbm5lY3QoZG9jdW1lbnQpOworCQkJZG9jdW1lbnQuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25lcik7CisJCX0KKwkJcmV0dXJuIGRvY3VtZW50OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wYXJ0aXRpb24vRW1mYXRpY1BhcnRpdGlvblNjYW5uZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3BhcnRpdGlvbi9FbWZhdGljUGFydGl0aW9uU2Nhbm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OWIxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wYXJ0aXRpb24vRW1mYXRpY1BhcnRpdGlvblNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5wYXJ0aXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLkVuZE9mTGluZVJ1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JUHJlZGljYXRlUnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLk11bHRpTGluZVJ1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5SdWxlQmFzZWRQYXJ0aXRpb25TY2FubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuU2luZ2xlTGluZVJ1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Ub2tlbjsKKworcHVibGljIGNsYXNzIEVtZmF0aWNQYXJ0aXRpb25TY2FubmVyIGV4dGVuZHMgUnVsZUJhc2VkUGFydGl0aW9uU2Nhbm5lciB7CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgcGFja2FnZVBhcnQgPSAicGFja2FnZVBhcnQiOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGltcG9ydFBhcnQgPSAiaW1wb3J0UGFydCI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgYW5ub3RhdGlvblBhcnQgPSAiYW5ub3RhdGlvblBhcnQiOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIHN1YlBhY2thZ2VQYXJ0ID0gInN1YlBhY2thZ2VQYXJ0IjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBhdHRyUGFydCA9ICJhdHRyUGFydCI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgcmVmUGFydCA9ICJyZWZQYXJ0IjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyB2YWxyUGFydCA9ICJ2YWxQYXJ0IjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBvcFBhcnQgPSAib3BQYXJ0IjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBkYXRhdHlwZVBhcnQgPSAiZGF0YXR5cGVQYXJ0IjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBlbnVtUGFydCA9ICJlbnVtUGFydCI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgbWFwZW50cnlQYXJ0ID0gIm1hcGVudHJ5UGFydCI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgY2xhc3NIZWFkaW5nUGFydCA9ICJjbGFzc0hlYWRpbmdQYXJ0IjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBpZmFjZUhlYWRpbmdQYXJ0ID0gImlmYWNlSGVhZGluZ1BhcnQiOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIG11bHRpTGluZUNvbW1lbnQgPSAibXVsdGlMaW5lQ29tbWVudCI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgc2luZ2xlTGluZUNvbW1lbnQgPSAic2luZ2xlTGluZUNvbW1lbnQiOworCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBjb250ZW50VHlwZXMoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nW10geyBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEUsIHBhY2thZ2VQYXJ0LCBpbXBvcnRQYXJ0LCBhbm5vdGF0aW9uUGFydCwgc3ViUGFja2FnZVBhcnQsCisJCQkJYXR0clBhcnQsIHJlZlBhcnQsIHZhbHJQYXJ0LCBvcFBhcnQsIGRhdGF0eXBlUGFydCwgZW51bVBhcnQsIG1hcGVudHJ5UGFydCwgY2xhc3NIZWFkaW5nUGFydCwKKwkJCQlpZmFjZUhlYWRpbmdQYXJ0LCBtdWx0aUxpbmVDb21tZW50LCBzaW5nbGVMaW5lQ29tbWVudCB9OworCX0KKworCXB1YmxpYyBFbWZhdGljUGFydGl0aW9uU2Nhbm5lcigpIHsKKworCQlJVG9rZW4gcGFja2FnZVBhcnRUb2tlbiA9IG5ldyBUb2tlbihwYWNrYWdlUGFydCk7IC8vIDEKKwkJSVRva2VuIGltcG9ydFBhcnRUb2tlbiA9IG5ldyBUb2tlbihpbXBvcnRQYXJ0KTsgLy8gMgorCQlJVG9rZW4gYW5ub3RhdGlvblBhcnRUb2tlbiA9IG5ldyBUb2tlbihhbm5vdGF0aW9uUGFydCk7IC8vIDMKKwkJSVRva2VuIHN1YlBhY2thZ2VQYXJ0VG9rZW4gPSBuZXcgVG9rZW4oc3ViUGFja2FnZVBhcnQpOyAvLyA0CisJCUlUb2tlbiBhdHRyUGFydFRva2VuID0gbmV3IFRva2VuKGF0dHJQYXJ0KTsgLy8gNQorCQlJVG9rZW4gcmVmUGFydFRva2VuID0gbmV3IFRva2VuKHJlZlBhcnQpOyAvLyA2CisJCUlUb2tlbiB2YWxyUGFydFRva2VuID0gbmV3IFRva2VuKHZhbHJQYXJ0KTsgLy8gNworCQlJVG9rZW4gb3BQYXJ0VG9rZW4gPSBuZXcgVG9rZW4ob3BQYXJ0KTsgLy8gOAorCQlJVG9rZW4gZGF0YXR5cGVQYXJ0VG9rZW4gPSBuZXcgVG9rZW4oZGF0YXR5cGVQYXJ0KTsgLy8gOQorCQlJVG9rZW4gZW51bVBhcnRUb2tlbiA9IG5ldyBUb2tlbihlbnVtUGFydCk7IC8vIDEwCisJCUlUb2tlbiBtYXBlbnRyeVBhcnRUb2tlbiA9IG5ldyBUb2tlbihtYXBlbnRyeVBhcnQpOyAvLyAxMQorCQlJVG9rZW4gY2xhc3NIZWFkaW5nUGFydFRva2VuID0gbmV3IFRva2VuKGNsYXNzSGVhZGluZ1BhcnQpOyAvLyAxMgorCQlJVG9rZW4gaWZhY2VIZWFkaW5nUGFydFRva2VuID0gbmV3IFRva2VuKGlmYWNlSGVhZGluZ1BhcnQpOyAvLyAxMworCQlJVG9rZW4gbXVsdGlMaW5lQ29tbWVudFRva2VuID0gbmV3IFRva2VuKG11bHRpTGluZUNvbW1lbnQpOyAvLyAxNAorCQlJVG9rZW4gc2luZ2xlTGluZUNvbW1lbnRUb2tlbiA9IG5ldyBUb2tlbihzaW5nbGVMaW5lQ29tbWVudCk7IC8vIDE1CisKKwkJSVByZWRpY2F0ZVJ1bGVbXSBydWxlcyA9IG5ldyBJUHJlZGljYXRlUnVsZVsxNl07CisKKwkJcnVsZXNbMF0gPSBuZXcgTm9uTWF0Y2hpbmdSdWxlKCk7CisJCXJ1bGVzWzFdID0gbmV3IFNpbmdsZUxpbmVSdWxlKCJwYWNrYWdlIiwgIjsiLCBwYWNrYWdlUGFydFRva2VuKTsKKwkJcnVsZXNbMl0gPSBuZXcgU2luZ2xlTGluZVJ1bGUoImltcG9ydCIsICI7IiwgaW1wb3J0UGFydFRva2VuKTsKKwkJcnVsZXNbM10gPSBuZXcgTXVsdGlMaW5lUnVsZSgiQCIsICIpIiwgYW5ub3RhdGlvblBhcnRUb2tlbik7CisJCXJ1bGVzWzRdID0gbmV3IFNpbmdsZUxpbmVSdWxlKCJwYWNrYWdlIiwgInsiLCBzdWJQYWNrYWdlUGFydFRva2VuKTsKKwkJcnVsZXNbNV0gPSBuZXcgTXVsdGlMaW5lUnVsZSgiYXR0ciIsICI7IiwgYXR0clBhcnRUb2tlbik7CisJCXJ1bGVzWzZdID0gbmV3IE11bHRpTGluZVJ1bGUoInJlZiIsICI7IiwgcmVmUGFydFRva2VuKTsKKwkJcnVsZXNbN10gPSBuZXcgTXVsdGlMaW5lUnVsZSgidmFsIiwgIjsiLCB2YWxyUGFydFRva2VuKTsKKwkJcnVsZXNbOF0gPSBuZXcgTXVsdGlMaW5lUnVsZSgib3AiLCAiOyIsIG9wUGFydFRva2VuKTsKKwkJcnVsZXNbOV0gPSBuZXcgTXVsdGlMaW5lUnVsZSgiZGF0YXR5cGUiLCAiOyIsIGRhdGF0eXBlUGFydFRva2VuKTsKKwkJcnVsZXNbMTBdID0gbmV3IE11bHRpTGluZVJ1bGUoImVudW0iLCAifSIsIGVudW1QYXJ0VG9rZW4pOworCQlydWxlc1sxMV0gPSBuZXcgTXVsdGlMaW5lUnVsZSgibWFwZW50cnkiLCAiOyIsIG1hcGVudHJ5UGFydFRva2VuKTsKKwkJcnVsZXNbMTJdID0gbmV3IE11bHRpTGluZVJ1bGUoImNsYXNzIiwgInsiLCBjbGFzc0hlYWRpbmdQYXJ0VG9rZW4pOworCQlydWxlc1sxM10gPSBuZXcgTXVsdGlMaW5lUnVsZSgiaW50ZXJmYWNlIiwgInsiLCBpZmFjZUhlYWRpbmdQYXJ0VG9rZW4pOworCQlydWxlc1sxNF0gPSBuZXcgTXVsdGlMaW5lUnVsZSgiLyoiLCAiKi8iLCBtdWx0aUxpbmVDb21tZW50VG9rZW4pOworCQlydWxlc1sxNV0gPSBuZXcgRW5kT2ZMaW5lUnVsZSgiLy8iLCBzaW5nbGVMaW5lQ29tbWVudFRva2VuKTsKKworCQlzZXRQcmVkaWNhdGVSdWxlcyhydWxlcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvcGFydGl0aW9uL0hUTUxBbm5vdGF0aW9uSG92ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3BhcnRpdGlvbi9IVE1MQW5ub3RhdGlvbkhvdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2MDYzNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3BhcnRpdGlvbi9IVE1MQW5ub3RhdGlvbkhvdmVyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkucGFydGl0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuRGVmYXVsdEFubm90YXRpb25Ib3ZlcjsKKworLyoqCisgKiBEZXRlcm1pbmVzIGFsbCBtYXJrZXJzIGZvciB0aGUgZ2l2ZW4gbGluZSBhbmQgY29sbGVjdHMsIGNvbmNhdGVuYXRlcywgYW5kCisgKiBmb3JtYXRzIHJldHVybnMgdGhlaXIgbWVzc2FnZXMgaW4gSFRNTC4KKyAqIAorICogQHNpbmNlIDMuMgorICovCitwdWJsaWMgY2xhc3MgSFRNTEFubm90YXRpb25Ib3ZlciBleHRlbmRzIERlZmF1bHRBbm5vdGF0aW9uSG92ZXIgeworCisJLyoKKwkgKiBGb3JtYXRzIGEgbWVzc2FnZSBhcyBIVE1MIHRleHQuCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRTaW5nbGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCUhUTUxQcmludGVyLmFkZFBhZ2VQcm9sb2coYnVmZmVyKTsKKwkJSFRNTFByaW50ZXIuYWRkUGFyYWdyYXBoKGJ1ZmZlciwgSFRNTFByaW50ZXIuY29udmVydFRvSFRNTENvbnRlbnQobWVzc2FnZSkpOworCQlIVE1MUHJpbnRlci5hZGRQYWdlRXBpbG9nKGJ1ZmZlcik7CisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9CisKKwkvKgorCSAqIEZvcm1hdHMgc2V2ZXJhbCBtZXNzYWdlIGFzIEhUTUwgdGV4dC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdE11bHRpcGxlTWVzc2FnZXMoTGlzdCBtZXNzYWdlcykgeworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlIVE1MUHJpbnRlci5hZGRQYWdlUHJvbG9nKGJ1ZmZlcik7CisJCUhUTUxQcmludGVyLmFkZFBhcmFncmFwaChidWZmZXIsIEhUTUxQcmludGVyLmNvbnZlcnRUb0hUTUxDb250ZW50KCJNdWx0aXBsZSBtYXJrZXJzIGF0IHRoaXMgbGluZSIpKTsKKworCQlIVE1MUHJpbnRlci5zdGFydEJ1bGxldExpc3QoYnVmZmVyKTsKKwkJSXRlcmF0b3IgZSA9IG1lc3NhZ2VzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChlLmhhc05leHQoKSkKKwkJCUhUTUxQcmludGVyLmFkZEJ1bGxldChidWZmZXIsIEhUTUxQcmludGVyLmNvbnZlcnRUb0hUTUxDb250ZW50KChTdHJpbmcpIGUubmV4dCgpKSk7CisJCUhUTUxQcmludGVyLmVuZEJ1bGxldExpc3QoYnVmZmVyKTsKKworCQlIVE1MUHJpbnRlci5hZGRQYWdlRXBpbG9nKGJ1ZmZlcik7CisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wYXJ0aXRpb24vSFRNTFByaW50ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3BhcnRpdGlvbi9IVE1MUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYWMxZTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wYXJ0aXRpb24vSFRNTFByaW50ZXIuamF2YQpAQCAtMCwwICsxLDMwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkucGFydGl0aW9uOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CisKKworLyoqCisgKiBQcm92aWRlcyBhIHNldCBvZiBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBjcmVhdGluZyBIVE1MIHBhZ2VzLgorICogPHA+CisgKiBNb3ZlZCBpbnRvIHRoaXMgcGFja2FnZSBmcm9tIDxjb2RlPm9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLnRleHQucmV2aXNpb25zPC9jb2RlPi48L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBIVE1MUHJpbnRlciB7CisKKwlwcml2YXRlIHN0YXRpYyBSR0IgQkdfQ09MT1JfUkdCPSBudWxsOworCisJc3RhdGljIHsKKwkJZmluYWwgRGlzcGxheSBkaXNwbGF5PSBEaXNwbGF5LmdldERlZmF1bHQoKTsKKwkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCXRyeSB7CisJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkvKgorCQkJCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQorCQkJCQkgKi8KKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJQkdfQ09MT1JfUkdCPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpLmdldFJHQigpOworCQkJCQl9CisJCQkJfSk7CisJCQl9IGNhdGNoIChTV1RFcnJvciBlcnIpIHsKKwkJCQkvLyBzZWU6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00NTI5NAorCQkJCWlmIChlcnIuY29kZSAhPSBTV1QuRVJST1JfREVWSUNFX0RJU1BPU0VEKQorCQkJCQl0aHJvdyBlcnI7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIEhUTUxQcmludGVyKCkgeworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyByZXBsYWNlKFN0cmluZyB0ZXh0LCBjaGFyIGMsIFN0cmluZyBzKSB7CisKKwkJaW50IHByZXZpb3VzPSAwOworCQlpbnQgY3VycmVudD0gdGV4dC5pbmRleE9mKGMsIHByZXZpb3VzKTsKKworCQlpZiAoY3VycmVudCA9PSAtMSkKKwkJCXJldHVybiB0ZXh0OworCisJCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJd2hpbGUgKGN1cnJlbnQgPiAtMSkgeworCQkJYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhwcmV2aW91cywgY3VycmVudCkpOworCQkJYnVmZmVyLmFwcGVuZChzKTsKKwkJCXByZXZpb3VzPSBjdXJyZW50ICsgMTsKKwkJCWN1cnJlbnQ9IHRleHQuaW5kZXhPZihjLCBwcmV2aW91cyk7CisJCX0KKwkJYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhwcmV2aW91cykpOworCisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9IVE1MQ29udGVudChTdHJpbmcgY29udGVudCkgeworCQljb250ZW50PSByZXBsYWNlKGNvbnRlbnQsICcmJywgIiZhbXA7Iik7IC8vJE5PTi1OTFMtMSQKKwkJY29udGVudD0gcmVwbGFjZShjb250ZW50LCAnIicsICImcXVvdDsiKTsgLy8kTk9OLU5MUy0xJAorCQljb250ZW50PSByZXBsYWNlKGNvbnRlbnQsICc8JywgIiZsdDsiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gcmVwbGFjZShjb250ZW50LCAnPicsICImZ3Q7Iik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKFJlYWRlciByZCkgeworCisJCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJY2hhcltdIHJlYWRCdWZmZXI9IG5ldyBjaGFyWzIwNDhdOworCisJCXRyeSB7CisJCQlpbnQgbj0gcmQucmVhZChyZWFkQnVmZmVyKTsKKwkJCXdoaWxlIChuID4gMCkgeworCQkJCWJ1ZmZlci5hcHBlbmQocmVhZEJ1ZmZlciwgMCwgbik7CisJCQkJbj0gcmQucmVhZChyZWFkQnVmZmVyKTsKKwkJCX0KKwkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgeworCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uLCBSR0IgYmdSR0IsIFVSTCBzdHlsZVNoZWV0VVJMKSB7CisKKwkJaWYgKGJnUkdCID09IG51bGwpCisJCQlpbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgcG9zaXRpb24sIHN0eWxlU2hlZXRVUkwpOworCQllbHNlIHsKKwkJCVN0cmluZ0J1ZmZlciBwYWdlUHJvbG9nPSBuZXcgU3RyaW5nQnVmZmVyKDMwMCk7CisKKwkJCXBhZ2VQcm9sb2cuYXBwZW5kKCI8aHRtbD4iKTsgLy8kTk9OLU5MUy0xJAorCisJCQlhcHBlbmRTdHlsZVNoZWV0VVJMKHBhZ2VQcm9sb2csIHN0eWxlU2hlZXRVUkwpOworCisJCQlwYWdlUHJvbG9nLmFwcGVuZCgiPGJvZHkgdGV4dD1cIiMwMDAwMDBcIiBiZ2NvbG9yPVwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFwcGVuZENvbG9yKHBhZ2VQcm9sb2csIGJnUkdCKTsKKwkJCXBhZ2VQcm9sb2cuYXBwZW5kKCJcIj4iKTsgLy8kTk9OLU5MUy0xJAorCisJCQlidWZmZXIuaW5zZXJ0KHBvc2l0aW9uLCAgcGFnZVByb2xvZy50b1N0cmluZygpKTsKKwkJfQorCX0KKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0UGFnZVByb2xvZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgcG9zaXRpb24sIFJHQiBiZ1JHQiwgU3RyaW5nIHN0eWxlU2hlZXQpIHsKKwkJCisJCWlmIChiZ1JHQiA9PSBudWxsKQorCQkJaW5zZXJ0UGFnZVByb2xvZyhidWZmZXIsIHBvc2l0aW9uLCBzdHlsZVNoZWV0KTsKKwkJZWxzZSB7CisJCQlTdHJpbmdCdWZmZXIgcGFnZVByb2xvZz0gbmV3IFN0cmluZ0J1ZmZlcigzMDApOworCQkJCisJCQlwYWdlUHJvbG9nLmFwcGVuZCgiPGh0bWw+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQorCQkJYXBwZW5kU3R5bGVTaGVldFVSTChwYWdlUHJvbG9nLCBzdHlsZVNoZWV0KTsKKwkJCQorCQkJcGFnZVByb2xvZy5hcHBlbmQoIjxib2R5IHRleHQ9XCIjMDAwMDAwXCIgYmdjb2xvcj1cIiIpOyAvLyROT04tTkxTLTEkCisJCQlhcHBlbmRDb2xvcihwYWdlUHJvbG9nLCBiZ1JHQik7CisJCQlwYWdlUHJvbG9nLmFwcGVuZCgiXCI+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQorCQkJYnVmZmVyLmluc2VydChwb3NpdGlvbiwgIHBhZ2VQcm9sb2cudG9TdHJpbmcoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0U3R5bGVzKFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZ1tdIHN0eWxlcykgeworCQlpZiAoc3R5bGVzID09IG51bGwgfHwgc3R5bGVzLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuOworCisJCVN0cmluZ0J1ZmZlciBzdHlsZUJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigxMCAqIHN0eWxlcy5sZW5ndGgpOworCQlmb3IgKGludCBpPSAwOyBzdHlsZXMgIT0gbnVsbCAmJiBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7CisJCQlzdHlsZUJ1Zi5hcHBlbmQoIiBzdHlsZT1cIiIpOyAvLyROT04tTkxTLTEkCisJCQlzdHlsZUJ1Zi5hcHBlbmQoc3R5bGVzW2ldKTsKKwkJCXN0eWxlQnVmLmFwcGVuZCgnIicpOworCQl9CisKKwkJLy8gRmluZCBpbnNlcnRpb24gaW5kZXgKKwkJLy8gYSkgd2l0aGluIGV4aXN0aW5nIGJvZHkgdGFnIHdpdGggdHJhaWxpbmcgc3BhY2UgCisJCWludCBpbmRleD0gYnVmZmVyLmluZGV4T2YoIjxib2R5ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChpbmRleCAhPSAtMSkgeworCQkJYnVmZmVyLmluc2VydChpbmRleCs1LCBzdHlsZUJ1Zik7CisJCQlyZXR1cm47CisJCX0KKworCQkvLyBiKSB3aXRoaW4gZXhpc3RpbmcgYm9keSB0YWcgd2l0aG91dCBhdHRyaWJ1dGVzCisJCWluZGV4PSBidWZmZXIuaW5kZXhPZigiPGJvZHk+Iik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGluZGV4ICE9IC0xKSB7CisJCQlidWZmZXIuaW5zZXJ0KGluZGV4KzUsICcgJyk7CisJCQlidWZmZXIuaW5zZXJ0KGluZGV4KzYsIHN0eWxlQnVmKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRQYWdlUHJvbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBwb3NpdGlvbiwgUkdCIGJnUkdCKSB7CisJCWlmIChiZ1JHQiA9PSBudWxsKQorCQkJaW5zZXJ0UGFnZVByb2xvZyhidWZmZXIsIHBvc2l0aW9uKTsKKwkJZWxzZSB7CisJCQlTdHJpbmdCdWZmZXIgcGFnZVByb2xvZz0gbmV3IFN0cmluZ0J1ZmZlcig2MCk7CisJCQlwYWdlUHJvbG9nLmFwcGVuZCgiPGh0bWw+PGJvZHkgdGV4dD1cIiMwMDAwMDBcIiBiZ2NvbG9yPVwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFwcGVuZENvbG9yKHBhZ2VQcm9sb2csIGJnUkdCKTsKKwkJCXBhZ2VQcm9sb2cuYXBwZW5kKCJcIj4iKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmluc2VydChwb3NpdGlvbiwgIHBhZ2VQcm9sb2cudG9TdHJpbmcoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZFN0eWxlU2hlZXRVUkwoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHN0eWxlU2hlZXQpIHsKKwkJaWYgKHN0eWxlU2hlZXQgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCWJ1ZmZlci5hcHBlbmQoIjxoZWFkPjxzdHlsZSBDSEFSU0VUPVwiSVNPLTg4NTktMVwiIFRZUEU9XCJ0ZXh0L2Nzc1wiPiIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoc3R5bGVTaGVldCk7CisJCWJ1ZmZlci5hcHBlbmQoIjwvc3R5bGU+PC9oZWFkPiIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kU3R5bGVTaGVldFVSTChTdHJpbmdCdWZmZXIgYnVmZmVyLCBVUkwgc3R5bGVTaGVldFVSTCkgeworCQlpZiAoc3R5bGVTaGVldFVSTCA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCWJ1ZmZlci5hcHBlbmQoIjxoZWFkPiIpOyAvLyROT04tTkxTLTEkCisKKwkJYnVmZmVyLmFwcGVuZCgiPExJTksgUkVMPVwic3R5bGVzaGVldFwiIEhSRUY9IFwiIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZChzdHlsZVNoZWV0VVJMKTsKKwkJYnVmZmVyLmFwcGVuZCgiXCIgQ0hBUlNFVD1cIklTTy04ODU5LTFcIiBUWVBFPVwidGV4dC9jc3NcIj4iKTsgLy8kTk9OLU5MUy0xJAorCisJCWJ1ZmZlci5hcHBlbmQoIjwvaGVhZD4iKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kQ29sb3IoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgUkdCIHJnYikgeworCQlidWZmZXIuYXBwZW5kKCcjJyk7CisJCWJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhyZ2IucmVkKSk7CisJCWJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhyZ2IuZ3JlZW4pKTsKKwkJYnVmZmVyLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHJnYi5ibHVlKSk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uKSB7CisJCWluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBwb3NpdGlvbiwgZ2V0QmdDb2xvcigpKTsgCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uLCBVUkwgc3R5bGVTaGVldFVSTCkgeworCQlpbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgcG9zaXRpb24sIGdldEJnQ29sb3IoKSwgc3R5bGVTaGVldFVSTCk7IAorCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0UGFnZVByb2xvZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgcG9zaXRpb24sIFN0cmluZyBzdHlsZVNoZWV0KSB7CisJCWluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBwb3NpdGlvbiwgZ2V0QmdDb2xvcigpLCBzdHlsZVNoZWV0KTsgCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUkdCIGdldEJnQ29sb3IoKSB7CisJCWlmIChCR19DT0xPUl9SR0IgIT0gbnVsbCkKKwkJCXJldHVybiBCR19DT0xPUl9SR0I7CisJCXJldHVybiBuZXcgUkdCKDI1NSwyNTUsIDIyNSk7IC8vIFJHQiB2YWx1ZSBvZiBpbmZvIGJnIGNvbG9yIG9uIFdpbmRvd3NYUAorCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworCQlpbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgYnVmZmVyLmxlbmd0aCgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUGFnZUVwaWxvZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCWJ1ZmZlci5hcHBlbmQoIjwvZm9udD48L2JvZHk+PC9odG1sPiIpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0QnVsbGV0TGlzdChTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisJCWJ1ZmZlci5hcHBlbmQoIjx1bD4iKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBlbmRCdWxsZXRMaXN0KFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKwkJYnVmZmVyLmFwcGVuZCgiPC91bD4iKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRCdWxsZXQoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGJ1bGxldCkgeworCQlpZiAoYnVsbGV0ICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIjxsaT4iKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChidWxsZXQpOworCQkJYnVmZmVyLmFwcGVuZCgiPC9saT4iKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZFNtYWxsSGVhZGVyKFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBoZWFkZXIpIHsKKwkJaWYgKGhlYWRlciAhPSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKCI8aDU+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWJ1ZmZlci5hcHBlbmQoaGVhZGVyKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIjwvaDU+Iik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQYXJhZ3JhcGgoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHBhcmFncmFwaCkgeworCQlpZiAocGFyYWdyYXBoICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoIjxwPiIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKHBhcmFncmFwaCk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUGFyYWdyYXBoKFN0cmluZ0J1ZmZlciBidWZmZXIsIFJlYWRlciBwYXJhZ3JhcGhSZWFkZXIpIHsKKwkJaWYgKHBhcmFncmFwaFJlYWRlciAhPSBudWxsKQorCQkJYWRkUGFyYWdyYXBoKGJ1ZmZlciwgcmVhZChwYXJhZ3JhcGhSZWFkZXIpKTsKKwl9CisJCisJLyoqCisJICogUmVwbGFjZXMgdGhlIGZvbGxvd2luZyBzdHlsZSBhdHRyaWJ1dGVzIG9mIHRoZSBmb250IGRlZmluaXRpb24gb2YgdGhlIDxjb2RlPmh0bWw8L2NvZGU+CisJICogZWxlbWVudDoKKwkgKiA8dWw+CisJICogPGxpPmZvbnQtc2l6ZTwvbGk+CisJICogPGxpPmZvbnQtd2VpZ2h0PC9saT4KKwkgKiA8bGk+Zm9udC1zdHlsZTwvbGk+CisJICogPGxpPmZvbnQtZmFtaWx5PC9saT4KKwkgKiA8L3VsPgorCSAqIFRoZSBmb250J3MgbmFtZSBpcyB1c2VkIGFzIGZvbnQgZmFtaWx5LCBhIDxjb2RlPnNhbnMtc2VyaWY8L2NvZGU+IGRlZmF1bHQgZm9udCBmYW1pbHkgaXMKKwkgKiBhcHBlbmRlZCBmb3IgdGhlIGNhc2UgdGhhdCB0aGUgZ2l2ZW4gZm9udCBuYW1lIGlzIG5vdCBhdmFpbGFibGUuCisJICogPHA+CisJICogSWYgdGhlIGxpc3RlZCBmb250IGF0dHJpYnV0ZXMgYXJlIG5vdCBjb250YWluZWQgaW4gdGhlIHBhc3NlZCBzdHlsZSBsaXN0LCBub3RoaW5nIGhhcHBlbnMuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBzdHlsZXMgQ1NTIHN0eWxlIGRlZmluaXRpb25zCisJICogQHBhcmFtIGZvbnREYXRhIHRoZSBmb250IGluZm9ybWF0aW9uIHRvIHVzZQorCSAqIEByZXR1cm4gdGhlIG1vZGlmaWVkIHN0eWxlIGRlZmluaXRpb25zCisJICogQHNpbmNlIDMuMworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb3BMZXZlbEZvbnQoU3RyaW5nIHN0eWxlcywgRm9udERhdGEgZm9udERhdGEpIHsKKwkJYm9vbGVhbiBib2xkPSAoZm9udERhdGEuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwOworCQlib29sZWFuIGl0YWxpYz0gKGZvbnREYXRhLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwOworCQkKKwkJLy8gU2VlOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1OTkzCisJCVN0cmluZyBzaXplPSBJbnRlZ2VyLnRvU3RyaW5nKGZvbnREYXRhLmdldEhlaWdodCgpKSArICgiY2FyYm9uIi5lcXVhbHMoU1dULmdldFBsYXRmb3JtKCkpID8gInB4IiA6ICJwdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkKKwkJU3RyaW5nIGZhbWlseT0gIiciICsgZm9udERhdGEuZ2V0TmFtZSgpICsgIicsc2Fucy1zZXJpZiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlzdHlsZXM9IHN0eWxlcy5yZXBsYWNlRmlyc3QoIihodG1sXFxzKlxcey4qKD86XFxzfDspZm9udC1zaXplOlxccyopXFxkK3B0KFxcOz8uKlxcfSkiLCAiJDEiICsgc2l6ZSArICIkMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQlzdHlsZXM9IHN0eWxlcy5yZXBsYWNlRmlyc3QoIihodG1sXFxzKlxcey4qKD86XFxzfDspZm9udC13ZWlnaHQ6XFxzKilcXHcrKFxcOz8uKlxcfSkiLCAiJDEiICsgKGJvbGQgPyAiYm9sZCIgOiAibm9ybWFsIikgKyAiJDIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCisJCXN0eWxlcz0gc3R5bGVzLnJlcGxhY2VGaXJzdCgiKGh0bWxcXHMqXFx7LiooPzpcXHN8Oylmb250LXN0eWxlOlxccyopXFx3KyhcXDs/LipcXH0pIiwgIiQxIiArIChpdGFsaWMgPyAiaXRhbGljIiA6ICJub3JtYWwiKSArICIkMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKKwkJc3R5bGVzPSBzdHlsZXMucmVwbGFjZUZpcnN0KCIoaHRtbFxccypcXHsuKig/Olxcc3w7KWZvbnQtZmFtaWx5OlxccyopLis/KDsuKlxcfSkiLCAiJDEiICsgZmFtaWx5ICsgIiQyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCXJldHVybiBzdHlsZXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvcGFydGl0aW9uL05vbk1hdGNoaW5nUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvcGFydGl0aW9uL05vbk1hdGNoaW5nUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDI5YTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wYXJ0aXRpb24vTm9uTWF0Y2hpbmdSdWxlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkucGFydGl0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JQ2hhcmFjdGVyU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklQcmVkaWNhdGVSdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVRva2VuOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47CisKKworcHVibGljIGNsYXNzIE5vbk1hdGNoaW5nUnVsZSBpbXBsZW1lbnRzIElQcmVkaWNhdGVSdWxlCit7CisKKwlwdWJsaWMgTm9uTWF0Y2hpbmdSdWxlKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIElUb2tlbiBnZXRTdWNjZXNzVG9rZW4oKQorCXsKKwkJcmV0dXJuIFRva2VuLlVOREVGSU5FRDsKKwl9CisKKwlwdWJsaWMgSVRva2VuIGV2YWx1YXRlKElDaGFyYWN0ZXJTY2FubmVyIHNjYW5uZXIsIGJvb2xlYW4gcmVzdW1lKQorCXsKKwkJcmV0dXJuIFRva2VuLlVOREVGSU5FRDsKKwl9CisKKwlwdWJsaWMgSVRva2VuIGV2YWx1YXRlKElDaGFyYWN0ZXJTY2FubmVyIHNjYW5uZXIpCisJeworCQlyZXR1cm4gVG9rZW4uVU5ERUZJTkVEOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvcHJlZmVyZW5jZXMvRW1mYXRpY1ByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wcmVmZXJlbmNlcy9FbWZhdGljUHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjM1NTliCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvcHJlZmVyZW5jZXMvRW1mYXRpY1ByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5FbWZhdGljVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5EaXJlY3RvcnlGaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5SYWRpb0dyb3VwRmllbGRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcmVmZXJlbmNlIHBhZ2UgdGhhdAorICogaXMgY29udHJpYnV0ZWQgdG8gdGhlIFByZWZlcmVuY2VzIGRpYWxvZy4gQnkgCisgKiBzdWJjbGFzc2luZyA8c2FtcD5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlPC9zYW1wPiwgd2UKKyAqIGNhbiB1c2UgdGhlIGZpZWxkIHN1cHBvcnQgYnVpbHQgaW50byBKRmFjZSB0aGF0IGFsbG93cworICogdXMgdG8gY3JlYXRlIGEgcGFnZSB0aGF0IGlzIHNtYWxsIGFuZCBrbm93cyBob3cgdG8gCisgKiBzYXZlLCByZXN0b3JlIGFuZCBhcHBseSBpdHNlbGYuCisgKiA8cD4KKyAqIFRoaXMgcGFnZSBpcyB1c2VkIHRvIG1vZGlmeSBwcmVmZXJlbmNlcyBvbmx5LiBUaGV5CisgKiBhcmUgc3RvcmVkIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgYmVsb25ncyB0bworICogdGhlIG1haW4gcGx1Zy1pbiBjbGFzcy4gVGhhdCB3YXksIHByZWZlcmVuY2VzIGNhbgorICogYmUgYWNjZXNzZWQgZGlyZWN0bHkgdmlhIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgorICovCisKK3B1YmxpYyBjbGFzcyBFbWZhdGljUHJlZmVyZW5jZVBhZ2UKKwlleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UKKwlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7CisKKwlwdWJsaWMgRW1mYXRpY1ByZWZlcmVuY2VQYWdlKCkgeworCQlzdXBlcihHUklEKTsKKwkJc2V0UHJlZmVyZW5jZVN0b3JlKEVtZmF0aWNVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOworCQlzZXREZXNjcmlwdGlvbigiQSBkZW1vbnN0cmF0aW9uIG9mIGEgcHJlZmVyZW5jZSBwYWdlIGltcGxlbWVudGF0aW9uIik7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIGZpZWxkIGVkaXRvcnMuIEZpZWxkIGVkaXRvcnMgYXJlIGFic3RyYWN0aW9ucyBvZgorCSAqIHRoZSBjb21tb24gR1VJIGJsb2NrcyBuZWVkZWQgdG8gbWFuaXB1bGF0ZSB2YXJpb3VzIHR5cGVzCisJICogb2YgcHJlZmVyZW5jZXMuIEVhY2ggZmllbGQgZWRpdG9yIGtub3dzIGhvdyB0byBzYXZlIGFuZAorCSAqIHJlc3RvcmUgaXRzZWxmLgorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKKwkJYWRkRmllbGQobmV3IERpcmVjdG9yeUZpZWxkRWRpdG9yKFByZWZlcmVuY2VDb25zdGFudHMuUF9QQVRILCAKKwkJCQkiJkRpcmVjdG9yeSBwcmVmZXJlbmNlOiIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKKwkJYWRkRmllbGQoCisJCQluZXcgQm9vbGVhbkZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuUF9CT09MRUFOLAorCQkJCSImU21hcnRCcmFjZSAoYWRkIGNsb3NpbmcgYnJhY2UgYXV0b21hdGljYWxseSkiLAorCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKKworCQlhZGRGaWVsZChuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKAorCQkJCVByZWZlcmVuY2VDb25zdGFudHMuUF9DSE9JQ0UsCisJCQkiQW4gZXhhbXBsZSBvZiBhIG11bHRpcGxlLWNob2ljZSBwcmVmZXJlbmNlIiwKKwkJCTEsCisJCQluZXcgU3RyaW5nW11bXSB7IHsgIiZDaG9pY2UgMSIsICJjaG9pY2UxIiB9LCB7CisJCQkJIkMmaG9pY2UgMiIsICJjaG9pY2UyIiB9CisJCX0sIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKKwkJYWRkRmllbGQoCisJCQluZXcgU3RyaW5nRmllbGRFZGl0b3IoUHJlZmVyZW5jZUNvbnN0YW50cy5QX1NUUklORywgIkEgJnRleHQgcHJlZmVyZW5jZToiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3ByZWZlcmVuY2VzL0VtZmF0aWNUZW1wbGF0ZXNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvcHJlZmVyZW5jZXMvRW1mYXRpY1RlbXBsYXRlc1ByZWZlcmVuY2VQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmMTIyZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3ByZWZlcmVuY2VzL0VtZmF0aWNUZW1wbGF0ZXNQcmVmZXJlbmNlUGFnZS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnByZWZlcmVuY2VzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuRW1mYXRpY1VJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY1RlbXBsYXRlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBFbWZhdGljVGVtcGxhdGVzUHJlZmVyZW5jZVBhZ2UoKSB7CisJCXNldFByZWZlcmVuY2VTdG9yZShFbWZhdGljVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKKwkJc2V0VGVtcGxhdGVTdG9yZShFbWZhdGljVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEVtZmF0aWNUZW1wbGF0ZVN0b3JlKCkpOworCQlzZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KEVtZmF0aWNVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RW1mYXRpY0NvbnRleHRUeXBlUmVnaXN0cnkoKSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2lzU2hvd0Zvcm1hdHRlclNldHRpbmcoKQorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzU2hvd0Zvcm1hdHRlclNldHRpbmcoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CisJCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKKworCQlpZiAob2spCisJCQlFbWZhdGljVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworCisJCXJldHVybiBvazsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0ZjY2YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5wcmVmZXJlbmNlczsKKworLyoqCisgKiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgcGx1Zy1pbiBwcmVmZXJlbmNlcworICovCitwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUNvbnN0YW50cyB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1BBVEggPSAicGF0aFByZWZlcmVuY2UiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9CT09MRUFOID0gImJvb2xlYW5QcmVmZXJlbmNlIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQ0hPSUNFID0gImNob2ljZVByZWZlcmVuY2UiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9TVFJJTkcgPSAic3RyaW5nUHJlZmVyZW5jZSI7CisJCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NWE1YTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5wcmVmZXJlbmNlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5FbWZhdGljVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOworCisvKioKKyAqIENsYXNzIHVzZWQgdG8gaW5pdGlhbGl6ZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgorICovCitwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgeworCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKKwkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEVtZmF0aWNVSVBsdWdpbi5nZXREZWZhdWx0KCkKKwkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CisJCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5QX0JPT0xFQU4sIHRydWUpOworCQlzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuUF9DSE9JQ0UsICJjaG9pY2UyIik7CisJCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5QX1NUUklORywKKwkJCQkiRGVmYXVsdCB2YWx1ZSIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvcmVkc3F1aWdnbGVzL0VtZmF0aWNDU1RDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvcmVkc3F1aWdnbGVzL0VtZmF0aWNDU1RDaGFuZ2VMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTQ0MGYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9yZWRzcXVpZ2dsZXMvRW1mYXRpY0NTVENoYW5nZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnJlZHNxdWlnZ2xlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuQ29tcFVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW1mYXRpY0FTVE5vZGVWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUubGFuZy5nZW4uYXN0Lk1hcEVudHJ5RGVjbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5Ub3BMZXZlbERlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuZWRpdG9yLkVtZmF0aWNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLnVpLnZpZXdzLnBhcnNldHJlZS5JUGFyc2VUcmVlQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY0NTVENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVBhcnNlVHJlZUNoYW5nZWRMaXN0ZW5lciB7CisKKwlFbWZhdGljRWRpdG9yIF9lZGl0b3I7CisJcHVibGljIHN0YXRpYyBRdWFsaWZpZWROYW1lIHFuQ1NUID0gbmV3IFF1YWxpZmllZE5hbWUoImRlLnR1aGguc3RzLmVtZmF0aWMiLCAiY3N0Iik7CisJcHVibGljIHN0YXRpYyBRdWFsaWZpZWROYW1lIHFuQVNUID0gbmV3IFF1YWxpZmllZE5hbWUoImRlLnR1aGguc3RzLmVtZmF0aWMiLCAiYXN0Iik7CisKKwlwdWJsaWMgRW1mYXRpY0NTVENoYW5nZUxpc3RlbmVyKEVtZmF0aWNFZGl0b3IgZWRpdG9yKSB7CisJCV9lZGl0b3IgPSBlZGl0b3I7CisJfQorCisJLyoqCisJICogcmVzcG9uc2libGUgZm9yIGZvbGRpbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCBwYXJzZVRyZWVDaGFuZ2VkKEFTVE5vZGVbXSBhcmcwKSB7CisJCS8qCisJCSAqIFRPRE8gYXJnMCBpcyBhbHdheXMgbnVsbCBiZWNhdXNlIExEVEVkaXRvciNzZXRQYXJzZVJvb3QgZ2l2ZXMganVzdAorCQkgKiB0aGF0IGluc3RlYWQgb2YgaXRzIF9wYXJzZVJvb3QKKwkJICovCisKKwkJLyoKKwkJICogc2VlIHRoZSByZXNvdXJjZSBsaXN0ZW5lciBFbWZhdGljUmVkU3F1aWdnbGVyIGZvciBhbiBhbHRlcm5hdGl2ZSB3YXkKKwkJICogb2YgbGlzdGVuaW5nCisJCSAqLworCisJCUlGaWxlIGVtZkZpbGUgPSBfZWRpdG9yLmdldEZpbGUoKTsKKwkJQ29tcFVuaXQgY29tcFVuaXQgPSAoQ29tcFVuaXQpIF9lZGl0b3IuZ2V0UGFyc2VSb290KCk7CisJCXRyeSB7CisJCQlpZiAoZW1mRmlsZSAhPSBudWxsKSB7CisJCQkJZW1mRmlsZS5zZXRTZXNzaW9uUHJvcGVydHkocW5DU1QsIGNvbXBVbml0KTsKKwkJCQllbWZGaWxlLnNldFNlc3Npb25Qcm9wZXJ0eShxbkFTVCwgbnVsbCk7CisJCQl9CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlpZiAoY29tcFVuaXQgIT0gbnVsbCkgeworCQkJLy8gdGhlIGFzdCB3YXMgc2V0IGluIEVtZmF0aWNQYXJzZXJEcml2ZXIjcGFyc2UoKQorCQkJRVBhY2thZ2Ugcm9vdFBhY2thZ2UgPSBjb21wVW5pdC5nZXRBU1QoKTsKKwkJCXRyeSB7CisJCQkJZW1mRmlsZS5zZXRTZXNzaW9uUHJvcGVydHkocW5BU1QsIHJvb3RQYWNrYWdlKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKworCQl1cGRhdGVGb2xkaW5nKCk7CisJCQorCQlyZXR1cm47CisJfQorCisJcHJpdmF0ZSBMaXN0PFBvc2l0aW9uPiBmUG9zaXRpb25zID0gbmV3IEFycmF5TGlzdDxQb3NpdGlvbj4oKTsKKworCXByaXZhdGUgdm9pZCB1cGRhdGVGb2xkaW5nKCkgeworCQlmUG9zaXRpb25zID0gbmV3IEFycmF5TGlzdDxQb3NpdGlvbj4oKTsKKwkJQ29tcFVuaXQgY29tcFVuaXQgPSAoQ29tcFVuaXQpIF9lZGl0b3IuZ2V0UGFyc2VSb290KCk7CisKKwkJaWYgKGNvbXBVbml0ID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCW5ldyBFbWZhdGljQVNUTm9kZVZpc2l0b3IoKSB7CisJCQlwdWJsaWMgYm9vbGVhbiBiZWdpblZpc2l0KFRvcExldmVsRGVjbCB0bGQpIHsKKwkJCQlpZiAoISh0bGQgaW5zdGFuY2VvZiBNYXBFbnRyeURlY2wpKSB7CisJCQkJCWludCBvZmZzZXQgPSB0bGQuZ2V0UmFuZ2VTdGFydCgpOworCQkJCQlpbnQgbGVuZ3RoID0gdGxkLmdldFJhbmdlTGVuZ3RoKCk7CisJCQkJCWlmIChzcGFuc1NldmVyYWxMaW5lcyhvZmZzZXQsIGxlbmd0aCkpIHsKKwkJCQkJCWZQb3NpdGlvbnMuYWRkKG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCkpOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJLyoKKwkJCSAqIGNvbW1lbnRzIChpbmNsdWRpbmcgbXVsdGlsaW5lIG9uZXMpIGFyZSBlYXRlbiB1cCBieSB0aGUgbGV4ZXIsCisJCQkgKiB0aGVyZSBhcmUgbm8gcHJvZHVjdGlvbnMgaW4gdGhlIGdyYW1tYXIgZm9yIGNvbW1lbnRzLCBhbmQgdGh1cworCQkJICogY2Fubm90IGJlIGZvbGRlZC4gT25jZSB0aGF0IGNoYW5nZXMsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGFkZCBhCisJCQkgKiB2aXNpdG9yIGhhbmRsZXIgd2hpY2ggY3JlYXRlcyBhIFBvc2l0aW9uIHRvIGluZGljYXRlIHRoYXQgcmVnaW9uCisJCQkgKiBjYW4gYmUgZm9sZGVkLiAKKwkJCSAqLworCQl9LnZpc2l0KGNvbXBVbml0LmdldFRvcExldmVsRGVjbHMoKSk7CisKKwkJX2VkaXRvci51cGRhdGVGb2xkaW5nU3RydWN0dXJlKGZQb3NpdGlvbnMpOworCisJfQorCisJcHJpdmF0ZSBib29sZWFuIHNwYW5zU2V2ZXJhbExpbmVzKGZpbmFsIGludCBvZmZzZXQsIGZpbmFsIGludCBsZW5ndGgpIHsKKwkJSURvY3VtZW50UHJvdmlkZXIgZHAgPSBfZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKKwkJSURvY3VtZW50IGRvYyA9IGRwLmdldERvY3VtZW50KF9lZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7CisJCWlmIChkb2MgIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlTdHJpbmdbXSBsaW5lcyA9IGRvYy5nZXQob2Zmc2V0LCBsZW5ndGgpLnNwbGl0KCJcbiIpOworCQkJCWJvb2xlYW4gcmVzID0gbGluZXMubGVuZ3RoID4gMjsKKwkJCQlyZXR1cm4gcmVzOworCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgeworCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3JlZHNxdWlnZ2xlcy9FbWZhdGljUmVkU3F1aWdnbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9yZWRzcXVpZ2dsZXMvRW1mYXRpY1JlZFNxdWlnZ2xlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzM2JkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9yZWRzcXVpZ2dsZXMvRW1mYXRpY1JlZFNxdWlnZ2xlci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnJlZHNxdWlnZ2xlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKKworCitwdWJsaWMgY2xhc3MgRW1mYXRpY1JlZFNxdWlnZ2xlciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKKworCS8qCisJICogQmVzaWRlcyBDaC4gIldvcmtzcGFjZSBSZXNvdXJjZSBQcm9ncmFtbWluZyIgaW4gSkRHRSwgZGV0YWlscyBjYW4gYmUKKwkgKiBmb3VuZCBpbgorCSAqIAorCSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvYXJ0aWNsZXMvQXJ0aWNsZS1SZXNvdXJjZS1kZWx0YXMvcmVzb3VyY2UtZGVsdGFzLmh0bWwKKwkgKiAKKwkgKiAKKwkgKi8KKworCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CisJCUlSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IEVtZmF0aWNSZWRTcXVpZ2dsZXJEZWx0YVZpc2l0b3IoKTsKKwkJdHJ5IHsKKwkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCisJCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS9yZWRzcXVpZ2dsZXMvRW1mYXRpY1JlZFNxdWlnZ2xlckRlbHRhVmlzaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvcmVkc3F1aWdnbGVzL0VtZmF0aWNSZWRTcXVpZ2dsZXJEZWx0YVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGY3NmJiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvcmVkc3F1aWdnbGVzL0VtZmF0aWNSZWRTcXVpZ2dsZXJEZWx0YVZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5yZWRzcXVpZ2dsZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworCitwdWJsaWMgY2xhc3MgRW1mYXRpY1JlZFNxdWlnZ2xlckRlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7CisJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJLy8gb25seSBpbnRlcmVzdGVkIGluIGNoYW5nZWQgcmVzb3VyY2VzIChub3QgYWRkZWQgb3IgcmVtb3ZlZCkKKwkJaWYgKGRlbHRhLmdldEtpbmQoKSAhPSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKQorCQkJcmV0dXJuIHRydWU7CisJCS8vIG5vdCBpbnRlcmVzdGVkIGluIG1hcmtlciBjaGFuZ2VzCisJCS8vIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1BUktFUlMpID09IDApCisJCS8vIHJldHVybiB0cnVlOworCQkvLyBpbnRlcmVzdGVkIGluIGNvbnRlbnQgY2hhbmdlcworCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSAwKQorCQkJcmV0dXJuIHRydWU7CisJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7CisJCS8vIG9ubHkgaW50ZXJlc3RlZCBpbiBmaWxlcyB3aXRoIHRoZSAidHh0IiBleHRlbnNpb24KKwkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiAiZW1mIi5lcXVhbHNJZ25vcmVDYXNlKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKKwkJCUlGaWxlIGVtZkZpbGUgPSAoSUZpbGUpIHJlc291cmNlOworCQkJX2pvYiA9IG5ldyBSZWRTcXVpZ2dsZXJKb2IoZW1mRmlsZSk7CisJCQlfam9iLnNjaGVkdWxlKCk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBjbGFzcyBSZWRTcXVpZ2dsZXJKb2IgZXh0ZW5kcyBKb2IgeworCisJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCS8qCisJCQkgKiBhY3R1YWxseSBhbGwgcmVkIHNxdWlnZ2xlcyBhcmUgcGxhY2VkIGluCisJCQkgKiBFbWZhdGljUGFyc2VyRHJpdmVyI3BhcnNlKCksIHRodXMgaGVyZSBvbmx5IHN0aGcgYmV5b25kIHRoYXQKKwkJCSAqIHNob3VsZCBnbworCQkJICovCisJCQlfam9iID0gbnVsbDsKKwkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQl9CisKKwkJUmVkU3F1aWdnbGVySm9iKElGaWxlIGVtZkZpbGUpIHsKKwkJCXN1cGVyKCJDb21wdXRpbmcgcmVkIHNxdWlnZ2xlcyAoRW1mYXRpY1JlZFNxdWlnZ2xlcikgZm9yICIgKyBlbWZGaWxlLmdldE5hbWUoKSk7CisJCQl0aGlzLmVtZkZpbGUgPSBlbWZGaWxlOworCQl9CisKKwkJcHJpdmF0ZSBJRmlsZSBlbWZGaWxlOworCisJfQorCisJcHJpdmF0ZSBSZWRTcXVpZ2dsZXJKb2IgX2pvYjsKKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvdGVtcGxhdGVzL0VtZmF0aWNDb250ZXh0VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvdGVtcGxhdGVzL0VtZmF0aWNDb250ZXh0VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyY2I1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS90ZW1wbGF0ZXMvRW1mYXRpY0NvbnRleHRUeXBlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkudGVtcGxhdGVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgbWlndWVsLmdhcmNpYUB0dWhoLmRlCisgKi8KK3B1YmxpYyBjbGFzcyBFbWZhdGljQ29udGV4dFR5cGUgCitleHRlbmRzIFRlbXBsYXRlQ29udGV4dFR5cGUgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNRkFUSUNfQ09OVEVYVF9UWVBFID0gIm9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnRlbXBsYXRlcy5FbWZhdGljQ29udGV4dFR5cGUiOworICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIEVtZmF0aWNDb250ZXh0VHlwZSgpIHsKKyAgICAJc3VwZXIoRU1GQVRJQ19DT05URVhUX1RZUEUpOworICAgICAgICBhZGRHbG9iYWxSZXNvbHZlcnMoKTsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBBbGwgZGVmYXVsdCBzb2x2ZXJzIHByb3ZpZGVkIGJ5IGVjbGlwc2UgYXJlIGVuYWJsZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkR2xvYmFsUmVzb2x2ZXJzKCkgeworICAgICAgICBhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuQ3Vyc29yKCkpOworICAgICAgICBhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuV29yZFNlbGVjdGlvbigpKTsKKyAgICAgICAgYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkxpbmVTZWxlY3Rpb24oKSk7CisgICAgICAgIGFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Eb2xsYXIoKSk7CisgICAgICAgIGFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5EYXRlKCkpOworICAgICAgICBhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuWWVhcigpKTsKKyAgICAgICAgYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlRpbWUoKSk7CisgICAgICAgIGFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Vc2VyKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3RlbXBsYXRlcy9FbWZhdGljVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS90ZW1wbGF0ZXMvRW1mYXRpY1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMmRhODcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS90ZW1wbGF0ZXMvRW1mYXRpY1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS50ZW1wbGF0ZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLkVtZmF0aWNVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLkNvbXBsZXRpb25Qcm9wb3NhbENvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CisKKy8qKgorICogCisgKiBAYXV0aG9yIG1pZ3VlbC5nYXJjaWFAdHVoaC5kZQorICovCitwdWJsaWMgY2xhc3MgRW1mYXRpY1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzCisJCVRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciB7CisKKwlUZW1wbGF0ZUNvbnRleHRUeXBlIGNvbnRleHQ7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgRW1mYXRpY1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcihTdHJpbmcgY29udGV4dE5hbWUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5jb250ZXh0ID0gRW1mYXRpY1VJUGx1Z2luLmdldERlZmF1bHQoKQorCQkJCS5nZXRFbWZhdGljQ29udGV4dFR5cGVSZWdpc3RyeSgpLmdldENvbnRleHRUeXBlKGNvbnRleHROYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZXMgdmFsaWQgZm9yIHRoZSBjb250ZXh0IHR5cGUgc3BlY2lmaWVkIGJ5CisJICogPGNvZGU+Y29udGV4dFR5cGVJZDwvY29kZT4uIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgdGhlCisJICogc2hhcmVkIFRlbXBsYXRlU3RvcmUuCisJICogCisJICogQHBhcmFtIGNvbnRleHRUeXBlSWQKKwkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUgaWQKKwkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZXMgdmFsaWQgZm9yIHRoaXMgY29udGV4dCB0eXBlIGlkCisJICovCisJcHJvdGVjdGVkIFRlbXBsYXRlW10gZ2V0VGVtcGxhdGVzKFN0cmluZyBjb250ZXh0VHlwZUlkKSB7CisJCXJldHVybiBFbWZhdGljVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEVtZmF0aWNUZW1wbGF0ZVN0b3JlKCkKKwkJCQkuZ2V0VGVtcGxhdGVzKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY29udGV4dCB0eXBlIHRoYXQgY2FuIGhhbmRsZSB0ZW1wbGF0ZSBpbnNlcnRpb24gYXQgdGhlIGdpdmVuCisJICogcmVnaW9uIGluIHRoZSB2aWV3ZXIncyBkb2N1bWVudC4KKwkgKiAKKwkgKiBAcGFyYW0gdmlld2VyCisJICogICAgICAgICAgICB0aGUgdGV4dCB2aWV3ZXIKKwkgKiBAcGFyYW0gcmVnaW9uCisJICogICAgICAgICAgICB0aGUgcmVnaW9uIGludG8gdGhlIGRvY3VtZW50IGRpc3BsYXllZCBieSB2aWV3ZXIKKwkgKiBAcmV0dXJuIHRoZSBjb250ZXh0IHR5cGUgdGhhdCBjYW4gaGFuZGxlIHRlbXBsYXRlIGV4cGFuc2lvbiBmb3IgdGhlIGdpdmVuCisJICogICAgICAgICBsb2NhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBleGlzdHMKKwkgKi8KKwlwcm90ZWN0ZWQgVGVtcGxhdGVDb250ZXh0VHlwZSBnZXRDb250ZXh0VHlwZShJVGV4dFZpZXdlciB2aWV3ZXIsCisJCQlJUmVnaW9uIHJlZ2lvbikgeworCQkvLyByZXR1cm4gRW1mYXRpY1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZXhDb250ZXh0VHlwZVJlZ2lzdHJ5KCkKKwkJLy8gLmdldENvbnRleHRUeXBlKEVtZmF0aWNDb250ZXh0VHlwZS5FTUZBVElDX0NPTlRFWFRfVFlQRSk7CisJCXJldHVybiBjb250ZXh0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gaW1hZ2UgZm9yIHRoZSBnaXZlbiB0ZW1wbGF0ZS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMKKwkgKiByZXR1cm5zIHRoZSBzYW1lIGljb24gKGNhbGxlZCAidGVtcGxhdGUiKS4KKwkgKiAKKwkgKiBAcGFyYW0gdGVtcGxhdGUKKwkgKiAgICAgICAgICAgIHRlbXBsYXRlCisJICogQHJldHVybiBpbWFnZSBmb3IgdGhlIGdpdmVuIHRlbXBsYXRlCisJICovCisJcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKFRlbXBsYXRlIHRlbXBsYXRlKSB7CisJCXJldHVybiBFbWZhdGljVUlQbHVnaW4uZ2V0SW1hZ2UoInRlbXBsYXRlIik7CisJfQorCisJLyoqCisJICogQWRkcyBhbGwgYXZhaWxhYmxlIHRlbXBsYXRlcyB0byB0aGUgZ2l2ZW4gbGlzdCwgYXZhaWxhYmxlIG1lYW5pbmcgaGVyZQorCSAqIHRoYXQgdGhlIHRlbXBsYXRlcyBtYXRjaCB0aGUgZm91bmQgcHJlZml4LgorCSAqIAorCSAqIEBwYXJhbSB2aWV3ZXIKKwkgKiAgICAgICAgICAgIFRoZSB2aWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWRpdG9yCisJICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0CisJICogICAgICAgICAgICBUaGUgb2Zmc2V0IGluIHRoZSBkb2N1bWVudCB3aGVyZSB0aGUgY29tcGxldGlvbnMgaG91bGQgdGFrZQorCSAqICAgICAgICAgICAgcGxhY2UKKwkgKiBAcGFyYW0gcHJlZml4CisJICogICAgICAgICAgICBUaGUgcHJlZml4IG9mIHRoZSBjb21wbGV0aW9uIHN0cmluZworCSAqIEByZXR1cm4gQW4gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBjb250YWluaW5nIHRoZQorCSAqICAgICAgICAgPGNvZGU+SUNvbXBsZXRpb25Qcm9wb3NhbHM8L2NvZGU+CisJICovCisJcHVibGljIEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBhZGRUZW1wbGF0ZVByb3Bvc2FscygKKwkJCUlUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0LCBTdHJpbmcgcHJlZml4KSB7CisKKwkJQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IHByb3BMaXN0ID0gbmV3IEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPigpOworCisJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSB0ZW1wbGF0ZVByb3Bvc2FscyA9IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKAorCQkJCXZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOworCisJCWZvciAoaW50IGogPSAwOyBqIDwgdGVtcGxhdGVQcm9wb3NhbHMubGVuZ3RoOyBqKyspIHsKKwkJCUlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSB0ZW1wbGF0ZVByb3Bvc2Fsc1tqXTsKKwkJCWlmIChwcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7CisJCQkJcHJvcExpc3QuYWRkKHRlbXBsYXRlUHJvcG9zYWxzW2pdKTsKKwkJCX0KKwkJfQorCQlDb2xsZWN0aW9ucy5zb3J0KHByb3BMaXN0LCBuZXcgQ29tcGxldGlvblByb3Bvc2FsQ29tcGFyYXRvcigpKTsKKworCQlyZXR1cm4gcHJvcExpc3Q7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7CisJCXJldHVybiBuZXcgY2hhcltdIHsgJ0AnIH07CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsCisJCQlpbnQgb2Zmc2V0KSB7CisJCWJvb2xlYW4gYWN0aXZhdGVkID0gZmFsc2U7CisJCXRyeSB7CisJCQlpZiAodmlld2VyLmdldERvY3VtZW50KCkuZ2V0Q2hhcihvZmZzZXQgLSAxKSA9PSAnQCcpIHsKKwkJCQlhY3RpdmF0ZWQgPSB0cnVlOworCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXMgPSBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2FscygKKwkJCQkJCXZpZXdlciwgb2Zmc2V0KTsKKwkJCQlyZXR1cm4gcmVzOworCQkJfQorCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW10ge307CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvdmlld3MvTWV0aG9kc1ZpZXdDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3ZpZXdzL01ldGhvZHNWaWV3Q29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0MmFlZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3ZpZXdzL01ldGhvZHNWaWV3Q29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkudmlld3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworCitwdWJsaWMgY2xhc3MgTWV0aG9kc1ZpZXdDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7CisJCisJcHJpdmF0ZSBUeXBlc1ZpZXcgX3R5cGVzVmlldyA9IG51bGw7CisKKwlwdWJsaWMgTWV0aG9kc1ZpZXdDb250ZW50UHJvdmlkZXIoVHlwZXNWaWV3IHR2KSB7CisJCV90eXBlc1ZpZXcgID0gdHY7IAorCX0KKworCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CisJCUVDbGFzcyBlQyA9IChFQ2xhc3MpIGlucHV0RWxlbWVudDsKKwkJTGlzdDxFT2JqZWN0PiBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxFT2JqZWN0PigpOworCQlpZiAoX3R5cGVzVmlldy5pc1Nob3dpbmdJbmhlcml0ZWRNZW1iZXJzKCkpIHsKKwkJCW1lbWJlcnMuYWRkQWxsKGVDLmdldEVBbGxBdHRyaWJ1dGVzKCkpOworCQkJbWVtYmVycy5hZGRBbGwoZUMuZ2V0RUFsbFJlZmVyZW5jZXMoKSk7CisJCQltZW1iZXJzLmFkZEFsbChlQy5nZXRFQWxsT3BlcmF0aW9ucygpKTsKKwkJfSBlbHNlIHsKKwkJCW1lbWJlcnMuYWRkQWxsKGVDLmdldEVBdHRyaWJ1dGVzKCkpOworCQkJbWVtYmVycy5hZGRBbGwoZUMuZ2V0RVJlZmVyZW5jZXMoKSk7CisJCQltZW1iZXJzLmFkZEFsbChlQy5nZXRFT3BlcmF0aW9ucygpKTsKKwkJfQorCQlFT2JqZWN0W10gcmVzID0gbmV3IEVPYmplY3RbbWVtYmVycy5zaXplKCldOyAKKwkJbWVtYmVycy50b0FycmF5KHJlcyk7CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCX0KKworCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQkvLyB3ZSdyZSBub3QgbGlzdGVuaW5nIGZvciBwcm9wZXJ0eSBjaGFuZ2VzCisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS92aWV3cy9NZXRob2RzVmlld0xhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3ZpZXdzL01ldGhvZHNWaWV3TGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzk5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS92aWV3cy9NZXRob2RzVmlld0xhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkudmlld3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5nZW5lcmF0b3IuZW1mYXRpYy5Xcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS51dGlsLkVtZmF0aWNPdXRsaW5lQnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKKworcHVibGljIGNsYXNzIE1ldGhvZHNWaWV3TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworCisJcHJpdmF0ZSBUeXBlc1ZpZXcgX3R5cGVzVmlldzsKKworCXB1YmxpYyBNZXRob2RzVmlld0xhYmVsUHJvdmlkZXIoVHlwZXNWaWV3IHR2KSB7CisJCV90eXBlc1ZpZXcgPSB0djsKKwl9CisKKwlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQlpZiAoY29sdW1uSW5kZXggIT0gMCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT3BlcmF0aW9uKSB7CisJCQlyZXR1cm4gRW1mYXRpY091dGxpbmVCdWlsZGVyLmdldE9wZXJhdGlvbkltYWdlKCk7CisJCX0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7CisJCQlyZXR1cm4gRW1mYXRpY091dGxpbmVCdWlsZGVyLmdldEF0dHJpYnV0ZUltYWdlKCk7CisJCX0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7CisJCQlyZXR1cm4gRW1mYXRpY091dGxpbmVCdWlsZGVyLmdldFJlZmVyZW5jZUltYWdlKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKKwkJCWJvb2xlYW4gcHJlcGVuZENsYXNzTmFtZSA9IF90eXBlc1ZpZXcuaXNTb3J0aW5nQnlEZWZpbmluZ1R5cGUoKTsKKwkJCVN0cmluZyByZXMgPSBsYWJlbEZvcihlbGVtZW50LCBwcmVwZW5kQ2xhc3NOYW1lKTsKKwkJCXJldHVybiByZXM7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxhYmVsRm9yKE9iamVjdCBlbGVtZW50LCBib29sZWFuIHByZXBlbmRDbGFzc05hbWUpIHsKKwkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpKSB7CisJCQlyZXR1cm4gIiI7CisJCX0KKwkJRU9iamVjdCBlTyA9IChFT2JqZWN0KSBlbGVtZW50OworCQlTdHJpbmcgcmVzID0gbnVsbDsKKwkJaWYgKGVPIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgeworCQkJcmVzID0gV3JpdGVyLmF0dHJpYnV0ZUVzc2VudGlhbHMoKEVBdHRyaWJ1dGUpIGVPKTsKKwkJfSBlbHNlIGlmIChlTyBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKKwkJCXJlcyA9IFdyaXRlci5yZWZlcmVuY2VFc3NlbnRpYWxzKChFUmVmZXJlbmNlKSBlTyk7CisJCX0gZWxzZSB7CisJCQlyZXMgPSBXcml0ZXIub3BlcmF0aW9uRXNzZW50aWFscygoRU9wZXJhdGlvbikgZU8pOworCQl9CisKKwkJaWYgKHByZXBlbmRDbGFzc05hbWUpIHsKKwkJCUVDbGFzcyBkZWNsYXJpbmdDbGFzcyA9IG51bGw7CisJCQlpZiAoZU8gaW5zdGFuY2VvZiBFT3BlcmF0aW9uKSB7CisJCQkJZGVjbGFyaW5nQ2xhc3MgPSAoKEVPcGVyYXRpb24pIGVPKS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7CisJCQl9CisJCQlpZiAoZU8gaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKKwkJCQlkZWNsYXJpbmdDbGFzcyA9ICgoRVN0cnVjdHVyYWxGZWF0dXJlKSBlTykKKwkJCQkJCS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7CisJCQl9CisJCQlpZiAoZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCkgeworCQkJCXJlcyA9ICIoICIgKyBkZWNsYXJpbmdDbGFzcy5nZXROYW1lKCkgKyAiICkgICAtICAgIiArIHJlczsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvdmlld3MvVHlwZUhpZXJhcmNoeU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS92aWV3cy9UeXBlSGllcmFyY2h5TWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2Q3YTFkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvdmlld3MvVHlwZUhpZXJhcmNoeU1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnZpZXdzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworcHVibGljIGZpbmFsIGNsYXNzIFR5cGVIaWVyYXJjaHlNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUU9ICJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudHlwZWhpZXJhcmNoeS5UeXBlSGllcmFyY2h5TWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgVHlwZUhpZXJhcmNoeU1lc3NhZ2VzKCkgeworCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmFibGVNZW1iZXJGaWx0ZXJBY3Rpb25fbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW5hYmxlTWVtYmVyRmlsdGVyQWN0aW9uX3Rvb2x0aXA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRW5hYmxlTWVtYmVyRmlsdGVyQWN0aW9uX2Rlc2NyaXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhpc3RvcnlEcm9wRG93bkFjdGlvbl9jbGVhcmhpc3RvcnlfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlT3JpZW50YXRpb25BY3Rpb25faG9yaXpvbnRhbF9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVPcmllbnRhdGlvbkFjdGlvbl9ob3Jpem9udGFsX3Rvb2x0aXA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlT3JpZW50YXRpb25BY3Rpb25faG9yaXpvbnRhbF9kZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVPcmllbnRhdGlvbkFjdGlvbl92ZXJ0aWNhbF9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVPcmllbnRhdGlvbkFjdGlvbl92ZXJ0aWNhbF90b29sdGlwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZU9yaWVudGF0aW9uQWN0aW9uX3ZlcnRpY2FsX2Rlc2NyaXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZU9yaWVudGF0aW9uQWN0aW9uX2F1dG9tYXRpY19sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVPcmllbnRhdGlvbkFjdGlvbl9hdXRvbWF0aWNfdG9vbHRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVPcmllbnRhdGlvbkFjdGlvbl9hdXRvbWF0aWNfZGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlT3JpZW50YXRpb25BY3Rpb25fc2luZ2xlX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZU9yaWVudGF0aW9uQWN0aW9uX3NpbmdsZV90b29sdGlwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZU9yaWVudGF0aW9uQWN0aW9uX3NpbmdsZV9kZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGb2N1c09uU2VsZWN0aW9uQWN0aW9uX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvY3VzT25TZWxlY3Rpb25BY3Rpb25fdG9vbHRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGb2N1c09uU2VsZWN0aW9uQWN0aW9uX2Rlc2NyaXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvY3VzT25UeXBlQWN0aW9uX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvY3VzT25UeXBlQWN0aW9uX3Rvb2x0aXA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRm9jdXNPblR5cGVBY3Rpb25fZGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRm9jdXNPblR5cGVBY3Rpb25fZGlhbG9nX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvY3VzT25UeXBlQWN0aW9uX2RpYWxvZ19tZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhpc3RvcnlEcm9wRG93bkFjdGlvbl90b29sdGlwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhpc3RvcnlBY3Rpb25fZGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSGlzdG9yeUFjdGlvbl90b29sdGlwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhpc3RvcnlMaXN0RGlhbG9nX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhpc3RvcnlMaXN0RGlhbG9nX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhpc3RvcnlMaXN0RGlhbG9nX3JlbW92ZV9idXR0b247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSGlzdG9yeUxpc3RBY3Rpb25fbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2hvd0luaGVyaXRlZE1lbWJlcnNBY3Rpb25fbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2hvd0luaGVyaXRlZE1lbWJlcnNBY3Rpb25fdG9vbHRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93SW5oZXJpdGVkTWVtYmVyc0FjdGlvbl9kZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93UXVhbGlmaWVkVHlwZU5hbWVzQWN0aW9uX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dRdWFsaWZpZWRUeXBlTmFtZXNBY3Rpb25fdG9vbHRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93UXVhbGlmaWVkVHlwZU5hbWVzQWN0aW9uX2Rlc2NyaXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRCeURlZmluaW5nVHlwZUFjdGlvbl9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0QnlEZWZpbmluZ1R5cGVBY3Rpb25fdG9vbHRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0QnlEZWZpbmluZ1R5cGVBY3Rpb25fZGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU3ViVHlwZUhpZXJhcmNoeVZpZXdlcl90aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdWJUeXBlSGllcmFyY2h5Vmlld2VyX2ZpbHRlcmVkX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1cGVyVHlwZUhpZXJhcmNoeVZpZXdlcl90aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdXBlclR5cGVIaWVyYXJjaHlWaWV3ZXJfZmlsdGVyZWRfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhZGl0aW9uYWxIaWVyYXJjaHlWaWV3ZXJfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhZGl0aW9uYWxIaWVyYXJjaHlWaWV3ZXJfZmlsdGVyZWRfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZUhpZXJhcmNoeVZpZXdQYXJ0X2Vycm9yX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFR5cGVIaWVyYXJjaHlWaWV3UGFydF9lcnJvcl9tZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFR5cGVIaWVyYXJjaHlWaWV3UGFydF9lbXB0eTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUeXBlSGllcmFyY2h5Vmlld1BhcnRfbm9kZWNsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFR5cGVIaWVyYXJjaHlWaWV3UGFydF9leGNlcHRpb25fdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZUhpZXJhcmNoeVZpZXdQYXJ0X2V4Y2VwdGlvbl9tZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFR5cGVIaWVyYXJjaHlWaWV3UGFydF90aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUeXBlSGllcmFyY2h5Vmlld1BhcnRfdG9vbHRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUeXBlSGllcmFyY2h5Vmlld1BhcnRfd3NfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZUhpZXJhcmNoeVZpZXdQYXJ0X3dzX3Rvb2x0aXA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZUhpZXJhcmNoeVZpZXdQYXJ0X3Jlc3RvcmVpbnB1dDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUeXBlSGllcmFyY2h5Vmlld1BhcnRfbGF5b3V0X3N1Ym1lbnU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlVmlld0FjdGlvbl9zdWJ0eXBlc19sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVWaWV3QWN0aW9uX3N1YnR5cGVzX3Rvb2x0aXA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlVmlld0FjdGlvbl9zdWJ0eXBlc19kZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVWaWV3QWN0aW9uX3N1cGVydHlwZXNfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlVmlld0FjdGlvbl9zdXBlcnR5cGVzX3Rvb2x0aXA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlVmlld0FjdGlvbl9zdXBlcnR5cGVzX2Rlc2NyaXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZVZpZXdBY3Rpb25fdmFqaGllcmFyY2h5X2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZVZpZXdBY3Rpb25fdmFqaGllcmFyY2h5X3Rvb2x0aXA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlVmlld0FjdGlvbl92YWpoaWVyYXJjaHlfZGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSGllcmFyY2h5SW5mb3JtYXRpb25Db250cm9sX21ldGhvZGhpZXJhcmNoeV9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBIaWVyYXJjaHlJbmZvcm1hdGlvbkNvbnRyb2xfaGllcmFyY2h5X2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhpZXJhcmNoeUluZm9ybWF0aW9uQ29udHJvbF90b2dnbGVfdHJhZGl0aW9uYWxoaWVyYXJjaHlfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSGllcmFyY2h5SW5mb3JtYXRpb25Db250cm9sX3RvZ2dsZV9zdXBlcmhpZXJhcmNoeV9sYWJlbDsKKworCXN0YXRpYyB7CisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFR5cGVIaWVyYXJjaHlNZXNzYWdlcy5jbGFzcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvdmlld3MvVHlwZUhpZXJhcmNoeU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS92aWV3cy9UeXBlSGllcmFyY2h5TWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY0NDA2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvdmlld3MvVHlwZUhpZXJhcmNoeU1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMDggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworRW5hYmxlTWVtYmVyRmlsdGVyQWN0aW9uX2xhYmVsPU1lbWJlcnMgaW4gSGllcmFyY2h5CitFbmFibGVNZW1iZXJGaWx0ZXJBY3Rpb25fdG9vbHRpcD1Mb2NrIFZpZXcgYW5kIFNob3cgTWVtYmVycyBpbiBIaWVyYXJjaHkKK0VuYWJsZU1lbWJlckZpbHRlckFjdGlvbl9kZXNjcmlwdGlvbj1Mb2NrIHZpZXcgYW5kIHNob3cgbWVtYmVycyBpbiBoaWVyYXJjaHkKKworVG9nZ2xlT3JpZW50YXRpb25BY3Rpb25faG9yaXpvbnRhbF9sYWJlbD0mSG9yaXpvbnRhbCBWaWV3IE9yaWVudGF0aW9uCitUb2dnbGVPcmllbnRhdGlvbkFjdGlvbl9ob3Jpem9udGFsX3Rvb2x0aXA9SG9yaXpvbnRhbCBWaWV3IE9yaWVudGF0aW9uCitUb2dnbGVPcmllbnRhdGlvbkFjdGlvbl9ob3Jpem9udGFsX2Rlc2NyaXB0aW9uPUhvcml6b250YWwgVmlldyBPcmllbnRhdGlvbgorCitUb2dnbGVPcmllbnRhdGlvbkFjdGlvbl92ZXJ0aWNhbF9sYWJlbD0mVmVydGljYWwgVmlldyBPcmllbnRhdGlvbgorVG9nZ2xlT3JpZW50YXRpb25BY3Rpb25fdmVydGljYWxfdG9vbHRpcD1WZXJ0aWNhbCBWaWV3IE9yaWVudGF0aW9uCitUb2dnbGVPcmllbnRhdGlvbkFjdGlvbl92ZXJ0aWNhbF9kZXNjcmlwdGlvbj1WZXJ0aWNhbCBWaWV3IE9yaWVudGF0aW9uCisKK1RvZ2dsZU9yaWVudGF0aW9uQWN0aW9uX2F1dG9tYXRpY19sYWJlbD0mQXV0b21hdGljIFZpZXcgT3JpZW50YXRpb24KK1RvZ2dsZU9yaWVudGF0aW9uQWN0aW9uX2F1dG9tYXRpY190b29sdGlwPUF1dG9tYXRpYyBWaWV3IE9yaWVudGF0aW9uCitUb2dnbGVPcmllbnRhdGlvbkFjdGlvbl9hdXRvbWF0aWNfZGVzY3JpcHRpb249QXV0b21hdGljIFZpZXcgT3JpZW50YXRpb24KKworCitUb2dnbGVPcmllbnRhdGlvbkFjdGlvbl9zaW5nbGVfbGFiZWw9SGllcmFyY2h5IFZpZXcgJk9ubHkKK1RvZ2dsZU9yaWVudGF0aW9uQWN0aW9uX3NpbmdsZV90b29sdGlwPUhpZXJhcmNoeSBWaWV3IE9ubHkKK1RvZ2dsZU9yaWVudGF0aW9uQWN0aW9uX3NpbmdsZV9kZXNjcmlwdGlvbj1IaWVyYXJjaHkgVmlldyBPbmx5CisKK0ZvY3VzT25TZWxlY3Rpb25BY3Rpb25fbGFiZWw9Rm8mY3VzIE9uICcnezB9JycKK0ZvY3VzT25TZWxlY3Rpb25BY3Rpb25fdG9vbHRpcD1Gb2N1cyB0aGUgVHlwZSBIaWVyYXJjaHkgb24gdGhlIFNlbGVjdGVkIEVsZW1lbnQKK0ZvY3VzT25TZWxlY3Rpb25BY3Rpb25fZGVzY3JpcHRpb249Rm9jdXMgdGhlIFR5cGUgSGllcmFyY2h5IG9uIHRoZSBzZWxlY3RlZCBlbGVtZW50CisKK0ZvY3VzT25UeXBlQWN0aW9uX2xhYmVsPUZvYyZ1cyBPbi4uLgorRm9jdXNPblR5cGVBY3Rpb25fdG9vbHRpcD1Gb2N1cyB0aGUgVHlwZSBIaWVyYXJjaHkgb24gYSBOZXcgVHlwZQorRm9jdXNPblR5cGVBY3Rpb25fZGVzY3JpcHRpb249Rm9jdXMgdGhlIFR5cGUgSGllcmFyY2h5IG9uIGEgbmV3IHR5cGUKK0ZvY3VzT25UeXBlQWN0aW9uX2RpYWxvZ190aXRsZT1Gb2N1cyBPbiBUeXBlCitGb2N1c09uVHlwZUFjdGlvbl9kaWFsb2dfbWVzc2FnZT0mU2VsZWN0IHRoZSB0eXBlIHRvIGJlIHNob3duIGluIHRoZSBUeXBlIEhpZXJhcmNoeSB2aWV3OgorCitIaXN0b3J5RHJvcERvd25BY3Rpb25fdG9vbHRpcD1QcmV2aW91cyBUeXBlIEhpZXJhcmNoaWVzCitIaXN0b3J5RHJvcERvd25BY3Rpb25fY2xlYXJoaXN0b3J5X2xhYmVsPUNsZWFyIEhpc3RvcnkKKworSGlzdG9yeUFjdGlvbl9kZXNjcmlwdGlvbj1PcGVuICcnezB9JycgaW4gSGllcmFyY2h5CitIaXN0b3J5QWN0aW9uX3Rvb2x0aXA9T3BlbiAnJ3swfScnIGluIEhpZXJhcmNoeQorCitIaXN0b3J5TGlzdERpYWxvZ190aXRsZT1UeXBlIEhpZXJhcmNoeSBIaXN0b3J5CitIaXN0b3J5TGlzdERpYWxvZ19sYWJlbD0mU2VsZWN0IHRoZSBlbGVtZW50IHRvIG9wZW4gaW4gdGhlIHR5cGUgaGllcmFyY2h5OgorSGlzdG9yeUxpc3REaWFsb2dfcmVtb3ZlX2J1dHRvbj0mUmVtb3ZlCisKK0hpc3RvcnlMaXN0QWN0aW9uX2xhYmVsPUhpc3RvcnkuLi4KKworU2hvd0luaGVyaXRlZE1lbWJlcnNBY3Rpb25fbGFiZWw9QWxsIEluaGVyaXRlZCBNZW1iZXJzCitTaG93SW5oZXJpdGVkTWVtYmVyc0FjdGlvbl90b29sdGlwPVNob3cgQWxsIEluaGVyaXRlZCBNZW1iZXJzCitTaG93SW5oZXJpdGVkTWVtYmVyc0FjdGlvbl9kZXNjcmlwdGlvbj1TaG93IGFsbCBpbmhlcml0ZWQgbWVtYmVycworCitTaG93UXVhbGlmaWVkVHlwZU5hbWVzQWN0aW9uX2xhYmVsPVNob3cgJlF1YWxpZmllZCBUeXBlIE5hbWVzCitTaG93UXVhbGlmaWVkVHlwZU5hbWVzQWN0aW9uX3Rvb2x0aXA9U2hvdyBRdWFsaWZpZWQgVHlwZSBOYW1lcworU2hvd1F1YWxpZmllZFR5cGVOYW1lc0FjdGlvbl9kZXNjcmlwdGlvbj1TaG93IHF1YWxpZmllZCB0eXBlIG5hbWVzCisKK1NvcnRCeURlZmluaW5nVHlwZUFjdGlvbl9sYWJlbD1Tb3J0IGJ5IHRoZSBEZWZpbmluZyBUeXBlCitTb3J0QnlEZWZpbmluZ1R5cGVBY3Rpb25fdG9vbHRpcD1Tb3J0IE1ldGhvZHMgYnkgdGhlIERlZmluaW5nIFR5cGUKK1NvcnRCeURlZmluaW5nVHlwZUFjdGlvbl9kZXNjcmlwdGlvbj1Tb3J0IG1ldGhvZHMgYnkgdGhlIGRlZmluaW5nIHR5cGUKKworU3ViVHlwZUhpZXJhcmNoeVZpZXdlcl90aXRsZT1IaWVyYXJjaHkKK1N1YlR5cGVIaWVyYXJjaHlWaWV3ZXJfZmlsdGVyZWRfdGl0bGU9SGllcmFyY2h5CisKK1N1cGVyVHlwZUhpZXJhcmNoeVZpZXdlcl90aXRsZT1IaWVyYXJjaHkKK1N1cGVyVHlwZUhpZXJhcmNoeVZpZXdlcl9maWx0ZXJlZF90aXRsZT1IaWVyYXJjaHkKKworVHJhZGl0aW9uYWxIaWVyYXJjaHlWaWV3ZXJfdGl0bGU9SGllcmFyY2h5CitUcmFkaXRpb25hbEhpZXJhcmNoeVZpZXdlcl9maWx0ZXJlZF90aXRsZT1IaWVyYXJjaHkKKworVHlwZUhpZXJhcmNoeVZpZXdQYXJ0X2Vycm9yX3RpdGxlPU9wZW4gVHlwZSBIaWVyYXJjaHkKKworVHlwZUhpZXJhcmNoeVZpZXdQYXJ0X2Vycm9yX21lc3NhZ2U9VGhlIHNlbGVjdGVkIGVsZW1lbnQgb25seSBleGlzdHMgaW4gdGhlIGVkaXRvci4gIFRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24geW91IGhhdmUgdG8gc2F2ZSB0aGUgZWRpdG9yIGZpcnN0LgorVHlwZUhpZXJhcmNoeVZpZXdQYXJ0X2VtcHR5PVRvIGRpc3BsYXkgdGhlIHR5cGUgaGllcmFyY2h5LCBzZWxlY3QgYSB0eXBlIChmb3IgZXhhbXBsZSBpbiB0aGUgb3V0bGluZSB2aWV3IG9yIGluIHRoZSBlZGl0b3IpLCBhbmQgc2VsZWN0IHRoZSBcJ09wZW4gVHlwZSBIaWVyYXJjaHlcJyBtZW51IG9wdGlvbi4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBkcmFnIGFuZCBkcm9wIGFuIGVsZW1lbnQgKGUuZy4gcHJvamVjdCwgcGFja2FnZSwgdHlwZSkgb250byB0aGlzIHZpZXcuCitUeXBlSGllcmFyY2h5Vmlld1BhcnRfbm9kZWNsPUFsbCB0eXBlcyBvZiB0aGUgY3VycmVudCBoaWVyYXJjaHkgJyd7MH0nJyBoYXZlIGJlZW4gZmlsdGVyZWQgYnkgZWl0aGVyIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldCBvciB0aGUgY2hvc2VuIGxvY2tlZCBtZXRob2QuCitUeXBlSGllcmFyY2h5Vmlld1BhcnRfZXhjZXB0aW9uX3RpdGxlPVR5cGUgSGllcmFyY2h5CitUeXBlSGllcmFyY2h5Vmlld1BhcnRfZXhjZXB0aW9uX21lc3NhZ2U9Q3JlYXRpbmcgaGllcmFyY2h5IGZhaWxlZC4gU2VlIGxvZyBmb3IgZGV0YWlscy4KKworVHlwZUhpZXJhcmNoeVZpZXdQYXJ0X3RpdGxlPXsxfQorVHlwZUhpZXJhcmNoeVZpZXdQYXJ0X3Rvb2x0aXA9ezB9IG9mICcnezF9JycKK1R5cGVIaWVyYXJjaHlWaWV3UGFydF93c190aXRsZT17MX0sIHdvcmtpbmcgc2V0OiB7Mn0KK1R5cGVIaWVyYXJjaHlWaWV3UGFydF93c190b29sdGlwPXswfSBvZiB7MX0gLSB3b3JraW5nIHNldDogezJ9CisKK1R5cGVIaWVyYXJjaHlWaWV3UGFydF9yZXN0b3JlaW5wdXQ9UmVzdG9yaW5nIHR5cGUgaGllcmFyY2h5IG9mICcnezB9JycuLi4KKworVHlwZUhpZXJhcmNoeVZpZXdQYXJ0X2xheW91dF9zdWJtZW51PSZMYXlvdXQKKworVG9nZ2xlVmlld0FjdGlvbl9zdWJ0eXBlc19sYWJlbD1TdSZidHlwZSBIaWVyYXJjaHkKK1RvZ2dsZVZpZXdBY3Rpb25fc3VidHlwZXNfdG9vbHRpcD1TaG93IHRoZSBTdWJ0eXBlIEhpZXJhcmNoeQorVG9nZ2xlVmlld0FjdGlvbl9zdWJ0eXBlc19kZXNjcmlwdGlvbj1TaG93IHRoZSBzdWJ0eXBlIGhpZXJhcmNoeQorCitUb2dnbGVWaWV3QWN0aW9uX3N1cGVydHlwZXNfbGFiZWw9U3UmcGVydHlwZSBIaWVyYXJjaHkKK1RvZ2dsZVZpZXdBY3Rpb25fc3VwZXJ0eXBlc190b29sdGlwPVNob3cgdGhlIFN1cGVydHlwZSBIaWVyYXJjaHkKK1RvZ2dsZVZpZXdBY3Rpb25fc3VwZXJ0eXBlc19kZXNjcmlwdGlvbj1TaG93IHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5CisKK1RvZ2dsZVZpZXdBY3Rpb25fdmFqaGllcmFyY2h5X2xhYmVsPSZUeXBlIEhpZXJhcmNoeQorVG9nZ2xlVmlld0FjdGlvbl92YWpoaWVyYXJjaHlfdG9vbHRpcD1TaG93IHRoZSBUeXBlIEhpZXJhcmNoeQorVG9nZ2xlVmlld0FjdGlvbl92YWpoaWVyYXJjaHlfZGVzY3JpcHRpb249U2hvdyB0aGUgdHlwZSBoaWVyYXJjaHkKKworSGllcmFyY2h5SW5mb3JtYXRpb25Db250cm9sX21ldGhvZGhpZXJhcmNoeV9sYWJlbD1UeXBlcyBpbXBsZW1lbnRpbmcgb3IgZGVmaW5pbmcgJyd7MH0uezF9JycKK0hpZXJhcmNoeUluZm9ybWF0aW9uQ29udHJvbF9oaWVyYXJjaHlfbGFiZWw9VHlwZSBoaWVyYXJjaHkgb2YgJyd7MH0nJzoKK0hpZXJhcmNoeUluZm9ybWF0aW9uQ29udHJvbF90b2dnbGVfdHJhZGl0aW9uYWxoaWVyYXJjaHlfbGFiZWw9UHJlc3MgJyd7MH0nJyB0byBzZWUgdGhlIHN1YnR5cGUgaGllcmFyY2h5CitIaWVyYXJjaHlJbmZvcm1hdGlvbkNvbnRyb2xfdG9nZ2xlX3N1cGVyaGllcmFyY2h5X2xhYmVsPVByZXNzICcnezB9JycgdG8gc2VlIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS92aWV3cy9UeXBlc1ZpZXcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3ZpZXdzL1R5cGVzVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOGEyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS92aWV3cy9UeXBlc1ZpZXcuamF2YQpAQCAtMCwwICsxLDUwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkudmlld3M7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5DbGFzc0RlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMuY29yZS5sYW5nLmdlbi5hc3QuRW1mYXRpY0FTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuRW1mYXRpY1VJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvci5FbWZhdGljRWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLmVkaXRvci5FbWZhdGljRWRpdG9yLlJlZmVyZWRFY29yZURlY2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuaHlwZXJsaW5rcy5FbWZhdGljSHlwZXJsaW5rRGV0ZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZ3ltbmFzdC5ydW50aW1lLmNvcmUuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuU2hvd0luQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OworCitwdWJsaWMgY2xhc3MgVHlwZXNWaWV3IGV4dGVuZHMgVmlld1BhcnQgaW1wbGVtZW50cyBJU2hvd0luVGFyZ2V0IHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnZpZXdzLlR5cGVzVmlldyI7CisKKwlwdWJsaWMgVHlwZXNWaWV3KCkgeworCQlzdXBlcigpOworCX0KKworCXByaXZhdGUgVHJlZVZpZXdlciB0eXBlc1ZpZXdlcjsKKwlwcml2YXRlIFRyZWVWaWV3ZXIgbWVtYmVyVmlld2VyOworCS8vIHByaXZhdGUgRHJpbGxEb3duQWRhcHRlciBkcmlsbERvd25BZGFwdGVyOworCXByaXZhdGUgQWN0aW9uIGFjdGlvblN1cGVydHlwZUg7CisJcHJpdmF0ZSBBY3Rpb24gYWN0aW9uU3VidHlwZUg7CisJcHJpdmF0ZSBUeXBlc1ZpZXdEb3VibGVDbGljayBkb3VibGVDbGlja0FjdGlvbjsKKwlwcml2YXRlIFN0cmluZyBfY3VycmVudENsYXNzaWZpZXIgPSAiIjsKKwlwcml2YXRlIFBhZ2VCb29rIGZQYWdlYm9vazsKKwlwcml2YXRlIExhYmVsIGZOb0hpZXJhcmNoeVNob3duTGFiZWw7CisJcHJpdmF0ZSBTYXNoRm9ybSBmVHlwZU1ldGhvZHNTcGxpdHRlcjsKKwlwcml2YXRlIFZpZXdGb3JtIGZUeXBlVmlld2VyVmlld0Zvcm07CisJcHJpdmF0ZSBQYWdlQm9vayBmVmlld2VyYm9vazsKKwlwcml2YXRlIFZpZXdGb3JtIGZNZXRob2RWaWV3ZXJWaWV3Rm9ybTsKKwlwcml2YXRlIFRhYmxlVmlld2VyIGZNZXRob2RzVmlld2VyOworCXByaXZhdGUgQ0xhYmVsIGZNZXRob2RWaWV3ZXJQYW5lTGFiZWw7CisJcHJpdmF0ZSBJQWN0aW9uIGZTaG93SW5oZXJpdGVkTWVtYmVyc0FjdGlvbjsKKwlwcml2YXRlIElBY3Rpb24gZlNvcnRCeURlZmluaW5nVHlwZUFjdGlvbjsKKworCS8qKgorCSAqIFRoaXMgaXMgYSBjYWxsYmFjayB0aGF0IHdpbGwgYWxsb3cgdXMgdG8gY3JlYXRlIHRoZSB2aWV3ZXIgYW5kIGluaXRpYWxpemUKKwkgKiBpdC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisKKwkJLyoKKwkJICogQSBwYWdlYm9vayBpcyBhIGNvbXBvc2l0ZSBjb250cm9sIHdoZXJlIG9ubHkgYSBzaW5nbGUgY29udHJvbCBpcworCQkgKiB2aXNpYmxlIGF0IGEgdGltZS4gSXQgaXMgc2ltaWxhciB0byBhIG5vdGVib29rLCBidXQgd2l0aG91dCB0YWJzLgorCQkgKi8KKwkJZlBhZ2Vib29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgU1dULk5PTkUpOworCisJCS8vIHBhZ2UgMSBvZiBwYWdlIGJvb2sgKG5vIGhpZXJhcmNoeSBsYWJlbCkKKworCQlmTm9IaWVyYXJjaHlTaG93bkxhYmVsID0gbmV3IExhYmVsKGZQYWdlYm9vaywgU1dULlRPUCArIFNXVC5MRUZUCisJCQkJKyBTV1QuV1JBUCk7CisJCWZOb0hpZXJhcmNoeVNob3duTGFiZWwKKwkJCQkuc2V0VGV4dChUeXBlSGllcmFyY2h5TWVzc2FnZXMuVHlwZUhpZXJhcmNoeVZpZXdQYXJ0X2VtcHR5KTsKKworCQkvLyBwYWdlIDIgb2YgcGFnZSBib29rICh2aWV3ZXJzKQorCisJCWZUeXBlTWV0aG9kc1NwbGl0dGVyID0gbmV3IFNhc2hGb3JtKGZQYWdlYm9vaywgU1dULlZFUlRJQ0FMKTsKKwkJZlR5cGVNZXRob2RzU3BsaXR0ZXIuc2V0VmlzaWJsZShmYWxzZSk7CisKKwkJZlR5cGVWaWV3ZXJWaWV3Rm9ybSA9IG5ldyBWaWV3Rm9ybShmVHlwZU1ldGhvZHNTcGxpdHRlciwgU1dULk5PTkUpOworCisJCUNvbnRyb2wgdHlwZVZpZXdlckNvbnRyb2wgPSBjcmVhdGVUeXBlVmlld2VyQ29udHJvbChmVHlwZVZpZXdlclZpZXdGb3JtKTsKKwkJZlR5cGVWaWV3ZXJWaWV3Rm9ybS5zZXRDb250ZW50KHR5cGVWaWV3ZXJDb250cm9sKTsKKworCQlmTWV0aG9kVmlld2VyVmlld0Zvcm0gPSBuZXcgVmlld0Zvcm0oZlR5cGVNZXRob2RzU3BsaXR0ZXIsIFNXVC5OT05FKTsKKwkJZlR5cGVNZXRob2RzU3BsaXR0ZXIuc2V0V2VpZ2h0cyhuZXcgaW50W10geyAzNSwgNjUgfSk7CisKKwkJQ29udHJvbCBtZXRob2RWaWV3ZXJQYXJ0ID0gY3JlYXRlTWV0aG9kVmlld2VyQ29udHJvbChmTWV0aG9kVmlld2VyVmlld0Zvcm0pOworCQlmTWV0aG9kVmlld2VyVmlld0Zvcm0uc2V0Q29udGVudChtZXRob2RWaWV3ZXJQYXJ0KTsKKworCQlmTWV0aG9kVmlld2VyUGFuZUxhYmVsID0gbmV3IENMYWJlbChmTWV0aG9kVmlld2VyVmlld0Zvcm0sIFNXVC5OT05FKTsKKwkJZk1ldGhvZFZpZXdlclZpZXdGb3JtLnNldFRvcExlZnQoZk1ldGhvZFZpZXdlclBhbmVMYWJlbCk7CisKKwkJZlR5cGVNZXRob2RzU3BsaXR0ZXIucGFjaygpOworCisJCW1ha2VUeXBlVmlld2VyQWN0aW9ucygpOworCQlob29rVHlwZVZpZXdlckNsaWNrQWN0aW9ucygpOworCQljb250cmlidXRlVG9BY3Rpb25CYXJzKCk7CisKKwkJZmlsbFRoZU1ldGhvZFZpZXdlclRvb2xiYXIoKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBmaWxsVGhlTWV0aG9kVmlld2VyVG9vbGJhcigpIHsKKwkJVG9vbEJhciBtZXRob2RWaWV3ZXJUb29sQmFyID0gbmV3IFRvb2xCYXIoZk1ldGhvZFZpZXdlclZpZXdGb3JtLAorCQkJCVNXVC5GTEFUIHwgU1dULldSQVApOworCQlmTWV0aG9kVmlld2VyVmlld0Zvcm0uc2V0VG9wQ2VudGVyKG1ldGhvZFZpZXdlclRvb2xCYXIpOworCisJCWZTaG93SW5oZXJpdGVkTWVtYmVyc0FjdGlvbiA9IG5ldyBBY3Rpb24oIlNob3cgaW5oZXJpdGVkIG1lbWJlcnMiLAorCQkJCUlBY3Rpb24uQVNfQ0hFQ0tfQk9YKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJZk1ldGhvZHNWaWV3ZXIucmVmcmVzaCgpOworCQkJfQorCQl9OworCQlmU2hvd0luaGVyaXRlZE1lbWJlcnNBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlNob3cgaW5oZXJpdGVkIG1lbWJlcnMiKTsKKwkJZlNob3dJbmhlcml0ZWRNZW1iZXJzQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihFbWZhdGljVUlQbHVnaW4KKwkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJ0eXBlc1ZpZXcvaW5oZXJfY28iKSk7CisJCWZTaG93SW5oZXJpdGVkTWVtYmVyc0FjdGlvbi5zZXRDaGVja2VkKGZhbHNlKTsKKworCQlmU29ydEJ5RGVmaW5pbmdUeXBlQWN0aW9uID0gbmV3IEFjdGlvbigiU29ydCBieSBkZWZpbmluZyB0eXBlIiwKKwkJCQlJQWN0aW9uLkFTX0NIRUNLX0JPWCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmICghaXNDaGVja2VkKCkpIHsKKwkJCQkJZk1ldGhvZHNWaWV3ZXIuc2V0U29ydGVyKG51bGwpOworCQkJCX0gZWxzZSB7CisJCQkJCWZNZXRob2RzVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgeworCisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgeworCisJCQkJCQkJaW50IHN1YnR5cGluZyA9IGNvbXBhcmVTdWJ0eXBpbmcoZTEsIGUyKTsKKwkJCQkJCQlpZiAoc3VidHlwaW5nICE9IDApIHsKKwkJCQkJCQkJcmV0dXJuIHN1YnR5cGluZzsKKwkJCQkJCQl9CisJCQkJCQkJU3RyaW5nIHMxID0gTWV0aG9kc1ZpZXdMYWJlbFByb3ZpZGVyLmxhYmVsRm9yKGUxLAorCQkJCQkJCQkJdHJ1ZSk7CisJCQkJCQkJU3RyaW5nIHMyID0gTWV0aG9kc1ZpZXdMYWJlbFByb3ZpZGVyLmxhYmVsRm9yKGUyLAorCQkJCQkJCQkJdHJ1ZSk7CisJCQkJCQkJcmV0dXJuIHMxLmNvbXBhcmVUbyhzMik7CisJCQkJCQl9CisKKwkJCQkJCXByaXZhdGUgaW50IGNvbXBhcmVTdWJ0eXBpbmcoT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKKwkJCQkJCQlpbnQgcmVzID0gMDsKKwkJCQkJCQlFQ2xhc3MgZGVjbENsYXNzMSA9IGRlY2xhcmluZ0NsYXNzKGUxKTsKKwkJCQkJCQlFQ2xhc3MgZGVjbENsYXNzMiA9IGRlY2xhcmluZ0NsYXNzKGUyKTsKKwkJCQkJCQlpZiAoZGVjbENsYXNzMSAhPSBudWxsICYmIGRlY2xDbGFzczIgIT0gbnVsbCkgeworCQkJCQkJCQlpZiAoZGVjbENsYXNzMS5nZXRFQWxsU3VwZXJUeXBlcygpLmNvbnRhaW5zKAorCQkJCQkJCQkJCWRlY2xDbGFzczIpKSB7CisJCQkJCQkJCQlyZXR1cm4gLTE7CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKGRlY2xDbGFzczIuZ2V0RUFsbFN1cGVyVHlwZXMoKS5jb250YWlucygKKwkJCQkJCQkJCQlkZWNsQ2xhc3MxKSkgeworCQkJCQkJCQkJcmV0dXJuIDE7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJcmV0dXJuIHJlczsKKwkJCQkJCX0KKworCQkJCQkJcHJpdmF0ZSBFQ2xhc3MgZGVjbGFyaW5nQ2xhc3MoT2JqZWN0IGUpIHsKKwkJCQkJCQlFQ2xhc3MgZUMgPSBudWxsOworCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7CisJCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGU7CisJCQkJCQkJCWVDID0gc2YuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEVPcGVyYXRpb24pIHsKKwkJCQkJCQkJRU9wZXJhdGlvbiBlT3AgPSAoRU9wZXJhdGlvbikgZTsKKwkJCQkJCQkJZUMgPSBlT3AuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOworCQkJCQkJCX0KKwkJCQkJCQlyZXR1cm4gZUM7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0KKwkJCQlmTWV0aG9kc1ZpZXdlci5yZWZyZXNoKCk7CisJCQl9CisJCX07CisJCWZTb3J0QnlEZWZpbmluZ1R5cGVBY3Rpb24uc2V0VG9vbFRpcFRleHQoIlNvcnQgYnkgZGVmaW5pbmcgdHlwZSIpOworCQlmU29ydEJ5RGVmaW5pbmdUeXBlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihFbWZhdGljVUlQbHVnaW4KKwkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJ0eXBlc1ZpZXcvZGVmaW5pbmd0eXBlX3NvcnRfY28iKSk7CisJCWZTb3J0QnlEZWZpbmluZ1R5cGVBY3Rpb24uc2V0Q2hlY2tlZChmYWxzZSk7CisKKwkJLy8gZmlsbCB0aGUgbWV0aG9kIHZpZXdlciB0b29sIGJhcgorCQlUb29sQmFyTWFuYWdlciBsb3dlcnRibWFuYWdlciA9IG5ldyBUb29sQmFyTWFuYWdlcihtZXRob2RWaWV3ZXJUb29sQmFyKTsKKwkJbG93ZXJ0Ym1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisJCWxvd2VydGJtYW5hZ2VyLmFkZChmU2hvd0luaGVyaXRlZE1lbWJlcnNBY3Rpb24pOworCQlsb3dlcnRibWFuYWdlci5hZGQoZlNvcnRCeURlZmluaW5nVHlwZUFjdGlvbik7CisJCWxvd2VydGJtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOworCisJCWxvd2VydGJtYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKKworCX0KKworCXByaXZhdGUgdm9pZCBpbml0QWN0aW9uTWVtYmVyKElBY3Rpb24gYSwgZmluYWwgU3RyaW5nIG1zZykgeworCQlhLnNldFRleHQobXNnKTsKKwkJYS5zZXRUb29sVGlwVGV4dChtc2cpOworCQlhLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpCisJCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKSk7CisJfQorCisJcHJpdmF0ZSBDb250cm9sIGNyZWF0ZU1ldGhvZFZpZXdlckNvbnRyb2woVmlld0Zvcm0gcGFyZW50KSB7CisKKwkJLyoKKwkJICogaG93IHRvIHVzZSBhIHRhYmxlIHZpZXdlcjoKKwkJICogaHR0cDovL3d3dy0xMjguaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saWJyYXJ5L29zLWVjZ3VpMi8KKwkJICogCisJCSAqLworCQlmTWV0aG9kc1ZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5CT1JERVIKKwkJCQl8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7CisJCWZNZXRob2RzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgTWV0aG9kc1ZpZXdDb250ZW50UHJvdmlkZXIodGhpcykpOworCQlmTWV0aG9kc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBNZXRob2RzVmlld0xhYmVsUHJvdmlkZXIodGhpcykpOworCisJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihmTWV0aG9kc1ZpZXdlci5nZXRUYWJsZSgpLAorCQkJCVNXVC5MRUZUKTsKKwkJY29sdW1uLnNldFRleHQoIk5hbWUiKTsKKwkJY29sdW1uLnNldFdpZHRoKDQwMCk7CisKKwkJZk1ldGhvZHNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOworCisJCUNvbnRyb2wgY29udHJvbCA9IGZNZXRob2RzVmlld2VyLmdldFRhYmxlKCk7CisKKwkJLy8gb24gZG91YmxlIGNsaWNrIG5hdmlnYXRlIGluIHRoZSBlZGl0b3IgdG8gZGVjbGFyYXRpb24KKwkJZk1ldGhvZHNWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7CisJCQkJaWYgKCEoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAorCQkJCQkJLmdldFNlbGVjdGlvbigpOworCQkJCWlmICghKHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBFT2JqZWN0KSkgeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCUVPYmplY3QgZU8gPSAoRU9iamVjdCkgc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJCQkvLyBUT0RPIGZpbmQgdGhlIHJpZ2h0IG9uZSEKKwkJCQlFbWZhdGljRWRpdG9yIGVkaXRvciA9IGdldEFjdGl2ZUVtZmF0aWNFZGl0b3IoKTsKKwkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKKwkJCQkJRW1mYXRpY0FTVE5vZGUgbGFuZGluZ1BsYWNlID0gRW1mYXRpY0h5cGVybGlua0RldGVjdG9yCisJCQkJCQkJLmdldExhbmRpbmdQbGFjZShlTywgZWRpdG9yKTsKKwkJCQkJaWYgKGxhbmRpbmdQbGFjZSAhPSBudWxsKSB7CisJCQkJCQllZGl0b3Iuc2V0U2VsZWN0aW9uKGxhbmRpbmdQbGFjZSwgdHJ1ZSk7CisJCQkJCQllZGl0b3Iuc2V0Rm9jdXMoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJcmV0dXJuIGNvbnRyb2w7CisJfQorCisJcHJpdmF0ZSBDb250cm9sIGNyZWF0ZVR5cGVWaWV3ZXJDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJZlZpZXdlcmJvb2sgPSBuZXcgUGFnZUJvb2socGFyZW50LCBTV1QuTlVMTCk7CisKKwkJLy8gS2V5TGlzdGVuZXIga2V5TGlzdGVuZXI9IGNyZWF0ZUtleUxpc3RlbmVyKCk7CisKKwkJLy8gQ3JlYXRlIHRoZSB2aWV3ZXJzCisJCXR5cGVzVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoZlZpZXdlcmJvb2ssIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTAorCQkJCXwgU1dULlZfU0NST0xMKTsKKworCQl0eXBlc1ZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKKworCQkJCWlmIChlMSBpbnN0YW5jZW9mIEVDbGFzcyAmJiBlMiBpbnN0YW5jZW9mIEVDbGFzcykgeworCQkJCQlFQ2xhc3MgZUMxID0gKEVDbGFzcykgZTE7CisJCQkJCUVDbGFzcyBlQzIgPSAoRUNsYXNzKSBlMjsKKwkJCQkJcmV0dXJuIGVDMS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShlQzIuZ2V0TmFtZSgpKTsKKwkJCQl9CisJCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOworCQkJfQorCQl9KTsKKworCQl0eXBlc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFR5cGVzVmlld0NvbnRlbnRQcm92aWRlcih0aGlzKSk7CisJCXR5cGVzVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFR5cGVzVmlld0xhYmVsUHJvdmlkZXIoKSk7CisKKwkJcmV0dXJuIGZWaWV3ZXJib29rOworCX0KKworCXByaXZhdGUgdm9pZCBjb250cmlidXRlVG9BY3Rpb25CYXJzKCkgeworCQlJQWN0aW9uQmFycyBiYXJzID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7CisJCWZpbGxMb2NhbFRvb2xCYXIoYmFycy5nZXRUb29sQmFyTWFuYWdlcigpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZmlsbExvY2FsVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgbWFuYWdlcikgeworCQltYW5hZ2VyLmFkZChhY3Rpb25TdXBlcnR5cGVIKTsKKwkJbWFuYWdlci5hZGQoYWN0aW9uU3VidHlwZUgpOworCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOworCX0KKworCXByaXZhdGUgdm9pZCBtYWtlVHlwZVZpZXdlckFjdGlvbnMoKSB7CisJCWFjdGlvblN1cGVydHlwZUggPSBuZXcgQWN0aW9uKCJTaG93IHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5IiwKKwkJCQlJQWN0aW9uLkFTX0NIRUNLX0JPWCkgeworCisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJYWN0aW9uU3VidHlwZUguc2V0Q2hlY2tlZCghYWN0aW9uU3VwZXJ0eXBlSC5pc0NoZWNrZWQoKSk7CisJCQkJZk1ldGhvZHNWaWV3ZXIuc2V0SW5wdXQobnVsbCk7CisJCQkJdHlwZXNWaWV3ZXIucmVmcmVzaCgpOworCQkJfQorCQl9OworCQlhY3Rpb25TdXBlcnR5cGVILnNldFRvb2xUaXBUZXh0KCJTaG93IHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5Iik7CisJCWFjdGlvblN1cGVydHlwZUguc2V0SW1hZ2VEZXNjcmlwdG9yKEVtZmF0aWNVSVBsdWdpbgorCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoInR5cGVzVmlldy9zdXBlcl9jbyIpKTsKKwkJYWN0aW9uU3VwZXJ0eXBlSC5zZXRDaGVja2VkKGZhbHNlKTsKKworCQlhY3Rpb25TdWJ0eXBlSCA9IG5ldyBBY3Rpb24oIlNob3cgdGhlIHN1YnR5cGUgaGllcmFyY2h5IiwKKwkJCQlJQWN0aW9uLkFTX0NIRUNLX0JPWCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWFjdGlvblN1cGVydHlwZUguc2V0Q2hlY2tlZCghYWN0aW9uU3VidHlwZUguaXNDaGVja2VkKCkpOworCQkJCWZNZXRob2RzVmlld2VyLnNldElucHV0KG51bGwpOworCQkJCXR5cGVzVmlld2VyLnJlZnJlc2goKTsKKwkJCX0KKwkJfTsKKwkJYWN0aW9uU3VidHlwZUguc2V0VGV4dCgiU2hvdyB0aGUgc3VidHlwZSBoaWVyYXJjaHkiKTsKKwkJYWN0aW9uU3VidHlwZUguc2V0VG9vbFRpcFRleHQoIlNob3cgdGhlIHN1YnR5cGUgaGllcmFyY2h5Iik7CisJCWFjdGlvblN1YnR5cGVILnNldEltYWdlRGVzY3JpcHRvcihFbWZhdGljVUlQbHVnaW4KKwkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJ0eXBlc1ZpZXcvc3ViX2NvIikpOworCQlhY3Rpb25TdWJ0eXBlSC5zZXRDaGVja2VkKHRydWUpOworCisJCWRvdWJsZUNsaWNrQWN0aW9uID0gbmV3IFR5cGVzVmlld0RvdWJsZUNsaWNrKHRoaXMsIHR5cGVzVmlld2VyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaG9va1R5cGVWaWV3ZXJDbGlja0FjdGlvbnMoKSB7CisKKwkJLy8gb24gZG91YmxlIGNsaWNrIG5hdmlnYXRlIGluIHRoZSBlZGl0b3IgdG8gRUNsYXNzIGRlY2xhcmF0aW9uCisJCXR5cGVzVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgeworCQkJCWRvdWJsZUNsaWNrQWN0aW9uLnJ1bigpOworCQkJfQorCQl9KTsKKworCQkvLyBvbiBzaW5nbGUgY2xpY2sgdXBkYXRlIHRoZSBtZW1iZXJzIHZpZXcKKwkJdHlwZXNWaWV3ZXIKKwkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKKwkJCQkJCQkJLmdldFNlbGVjdGlvbigpOworCQkJCQkJaWYgKCEoc3NlbC5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVDbGFzcykpIHsKKwkJCQkJCQlmTWV0aG9kc1ZpZXdlci5zZXRJbnB1dChudWxsKTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCQlFQ2xhc3MgZUMgPSAoRUNsYXNzKSBzc2VsLmdldEZpcnN0RWxlbWVudCgpOworCQkJCQkJZk1ldGhvZHNWaWV3ZXIuc2V0SW5wdXQoZUMpOworCQkJCQl9CisJCQkJfSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNob3dNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHR5cGVzVmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLAorCQkJCSJUeXBlcyBWaWV3IiwgbWVzc2FnZSk7CisJfQorCisJLyoqCisJICogUGFzc2luZyB0aGUgZm9jdXMgcmVxdWVzdCB0byB0aGUgdmlld2VyJ3MgY29udHJvbC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKwkJZlBhZ2Vib29rLnNldEZvY3VzKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0SW5wdXQoV2Vha1JlZmVyZW5jZTxFQ2xhc3M+IHdyQywgYm9vbGVhbiBuYXZpZ2F0ZUluRWRpdG9yKSB7CisJCUVDbGFzcyBlQyA9IHdyQy5nZXQoKTsKKwkJX2N1cnJlbnRDbGFzc2lmaWVyID0gZ2V0UXVhbGlmaWVkTmFtZShlQyk7CisJCXR5cGVzVmlld2VyLnNldElucHV0KHdyQyk7CisJCWZQYWdlYm9vay5zaG93UGFnZShmVHlwZU1ldGhvZHNTcGxpdHRlcik7CisJCWZWaWV3ZXJib29rLnNob3dQYWdlKHR5cGVzVmlld2VyLmdldENvbnRyb2woKSk7CisJCXR5cGVzVmlld2VyLmdldFRyZWUoKS5zZXRGb2N1cygpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoRUNsYXNzaWZpZXIgZUMpIHsKKwkJU3RyaW5nIHJlcyA9IGVDLmdldE5hbWUoKTsKKwkJRVBhY2thZ2UgZVAgPSBlQy5nZXRFUGFja2FnZSgpOworCQlkbyB7CisJCQlyZXMgPSBlUC5nZXROYW1lKCkgKyAiLiIgKyByZXM7CisJCQllUCA9IGVQLmdldEVTdXBlclBhY2thZ2UoKTsKKwkJfSB3aGlsZSAoZVAgIT0gbnVsbCk7CisJCXJldHVybiByZXM7CisJfQorCisJLyoqCisJICogc2VlIHAuIDQ2NyBhbmQgcC4gNDk5IG9mIEpER0UgMm5kIEVkCisJICovCisJcHVibGljIGJvb2xlYW4gc2hvdyhTaG93SW5Db250ZXh0IGNvbnRleHQpIHsKKwkJaWYgKGNvbnRleHQgPT0gbnVsbCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmICghKGNvbnRleHQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoIShjb250ZXh0LmdldElucHV0KCkgaW5zdGFuY2VvZiBJRmlsZSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlFbWZhdGljRWRpdG9yIGVkaXRvciA9IGdldEFjdGl2ZUVtZmF0aWNFZGl0b3IoKTsKKwkJaWYgKGVkaXRvciA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJSVRleHRTZWxlY3Rpb24gdHMgPSAoSVRleHRTZWxlY3Rpb24pIGNvbnRleHQuZ2V0U2VsZWN0aW9uKCk7CisJCWludCBvZmZzZXQgPSB0cy5nZXRPZmZzZXQoKTsKKwkJaW50IGxlbmd0aCA9IHRzLmdldExlbmd0aCgpOworCQlSZWZlcmVkRWNvcmVEZWNsIHJlZCA9IGVkaXRvci5nZXRSZWZlcmVkRWNvcmVEZWNsKG9mZnNldCwgbGVuZ3RoKTsKKworCQlFT2JqZWN0IGVjb3JlRGVjbCA9IG51bGw7CisKKwkJaWYgKHJlZCA9PSBudWxsIHx8IHJlZC5lY29yZURlY2wgPT0gbnVsbCkgeworCQkJLy8gcGVyaGFwcyB0aGUgY3Vyc29yIGlzIGF0IGEgZGVjbGFyYXRpb24gYW5kIG5vdCBhdCBhIHVzYWdlCisJCQlBU1ROb2RlIG4gPSBlZGl0b3IuZ2V0Q2xvc2VzdEVuY2xvc2luZ0FTVE5vZGVBdChvZmZzZXQsCisJCQkJCUNsYXNzRGVjbC5jbGFzcyk7CisJCQllY29yZURlY2wgPSBlZGl0b3IuZ2V0Q3N0RGVjbDJFY29yZUFTVCgpLmdldChuKTsKKwkJCWlmIChlY29yZURlY2wgPT0gbnVsbCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVjb3JlRGVjbCA9IHJlZC5lY29yZURlY2w7CisJCX0KKworCQlpZiAoIShlY29yZURlY2wgaW5zdGFuY2VvZiBFQ2xhc3MpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJRUNsYXNzIGVDID0gKEVDbGFzcykgZWNvcmVEZWNsOworCQlXZWFrUmVmZXJlbmNlPEVDbGFzcz4gd3JDID0gbmV3IFdlYWtSZWZlcmVuY2U8RUNsYXNzPihlQyk7CisJCXNldElucHV0KHdyQywgZmFsc2UpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlFbWZhdGljRWRpdG9yIGdldEVkaXRvcihJRmlsZSBmKSB7CisJCUlXb3JrYmVuY2hQYWdlW10gd3BzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQorCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRQYWdlcygpOworCQlmb3IgKElXb3JrYmVuY2hQYWdlIHdwIDogd3BzKSB7CisJCQlJRWRpdG9yUGFydFtdIGVkc0luUGFnZSA9IHdwLmdldEVkaXRvcnMoKTsKKwkJCWZvciAoSUVkaXRvclBhcnQgZXAgOiBlZHNJblBhZ2UpIHsKKwkJCQlpZiAoZXAgaW5zdGFuY2VvZiBFbWZhdGljRWRpdG9yKSB7CisJCQkJCUVtZmF0aWNFZGl0b3IgZWUgPSAoRW1mYXRpY0VkaXRvcikgZXA7CisJCQkJCWlmICghKGVlLmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpKSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkJCQlGaWxlRWRpdG9ySW5wdXQgZmVpID0gKEZpbGVFZGl0b3JJbnB1dCkgZWUuZ2V0RWRpdG9ySW5wdXQoKTsKKwkJCQkJaWYgKGZlaS5nZXRGaWxlKCkgPT0gZikgeworCQkJCQkJcmV0dXJuIGVlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUVtZmF0aWNFZGl0b3IgZ2V0QWN0aXZlRW1mYXRpY0VkaXRvcigpIHsKKwkJSUVkaXRvclBhcnQgZXAgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCisJCQkJLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKKwkJaWYgKGVwIGluc3RhbmNlb2YgRW1mYXRpY0VkaXRvcikgeworCQkJRW1mYXRpY0VkaXRvciBlZSA9IChFbWZhdGljRWRpdG9yKSBlcDsKKwkJCXJldHVybiBlZTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldFR5cGVzVmlld2VySW5wdXQoKSB7CisJCU9iamVjdCBpID0gdHlwZXNWaWV3ZXIuZ2V0SW5wdXQoKTsKKwkJcmV0dXJuIGk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNTaG93aW5TdXBlclR5cGVIaWVyYXJjaHkoKSB7CisJCXJldHVybiBhY3Rpb25TdXBlcnR5cGVILmlzQ2hlY2tlZCgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzU2hvd2luZ0luaGVyaXRlZE1lbWJlcnMoKSB7CisJCXJldHVybiBmU2hvd0luaGVyaXRlZE1lbWJlcnNBY3Rpb24uaXNDaGVja2VkKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNTb3J0aW5nQnlEZWZpbmluZ1R5cGUoKSB7CisJCXJldHVybiBmU29ydEJ5RGVmaW5pbmdUeXBlQWN0aW9uLmlzQ2hlY2tlZCgpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3ZpZXdzL1R5cGVzVmlld0NvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvdmlld3MvVHlwZXNWaWV3Q29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3ZWZiYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3ZpZXdzL1R5cGVzVmlld0NvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS52aWV3czsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKK2NsYXNzIFR5cGVzVmlld0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKKworCVR5cGVzVmlldyBfdHlwZXNWaWV3ID0gbnVsbDsKKwlFQ2xhc3MgbGFzdFNob3duID0gbnVsbDsKKworCXB1YmxpYyBUeXBlc1ZpZXdDb250ZW50UHJvdmlkZXIoVHlwZXNWaWV3IHR2KSB7CisJCV90eXBlc1ZpZXcgPSB0djsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHYsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisJCS8vIHdlJ3JlIG5vdCBsaXN0ZW5pbmcgZm9yIHByb3BlcnR5IGNoYW5nZXMKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCX0KKworCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBXZWFrUmVmZXJlbmNlKSB7CisJCQlXZWFrUmVmZXJlbmNlIHdyQyA9IChXZWFrUmVmZXJlbmNlKSBwYXJlbnQ7CisJCQlFQ2xhc3MgZUMgPSAoRUNsYXNzKSB3ckMuZ2V0KCk7CisJCQlyZXR1cm4gbmV3IEVDbGFzc1tdIHsgZUMgfTsKKwkJfQorCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRUNsYXNzKSB7CisJCQlFQ2xhc3MgZUMgPSAoRUNsYXNzKSBwYXJlbnQ7CisJCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZUMpOworCQl9CisJCXJldHVybiBuZXcgT2JqZWN0W10ge307CisJfQorCisJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7CisJCUVDbGFzcyBlQyA9IChFQ2xhc3MpIGNoaWxkOworCQlpZiAoX3R5cGVzVmlldy5pc1Nob3dpblN1cGVyVHlwZUhpZXJhcmNoeSgpKSB7CisJCQlpZiAoc3ViQ2xhc3Nlc09mKGVDKS5sZW5ndGggPiAwKSB7CisJCQkJRUNsYXNzIGZzdFN1YnR5cGUgPSBzdWJDbGFzc2VzT2YoZUMpWzBdOworCQkJCXJldHVybiBmc3RTdWJ0eXBlOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChlQy5nZXRFU3VwZXJUeXBlcygpLnNpemUoKSA+IDApIHsKKwkJCQlFQ2xhc3MgZmlyc3RQYXJlbnQgPSBlQy5nZXRFU3VwZXJUeXBlcygpLmdldCgwKTsKKwkJCQlyZXR1cm4gZmlyc3RQYXJlbnQ7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJfQorCisJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKKwkJRUNsYXNzIGVDID0gKEVDbGFzcykgcGFyZW50OworCQlFQ2xhc3NbXSByZXM7CisJCWlmIChfdHlwZXNWaWV3LmlzU2hvd2luU3VwZXJUeXBlSGllcmFyY2h5KCkpIHsKKwkJCXJlcyA9IHN1cGVyVHlwZXNPZihlQyk7CisJCX0gZWxzZSB7CisJCQlyZXMgPSBzdWJDbGFzc2VzT2YoZUMpOworCQl9CisJCXJldHVybiByZXM7CisJfQorCisJcHJpdmF0ZSBFQ2xhc3NbXSBzdXBlclR5cGVzT2YoRUNsYXNzIGVDKSB7CisJCUVDbGFzc1tdIHJlcyA9IG5ldyBFQ2xhc3NbZUMuZ2V0RVN1cGVyVHlwZXMoKS5zaXplKCldOworCQllQy5nZXRFU3VwZXJUeXBlcygpLnRvQXJyYXkocmVzKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwcml2YXRlIEVDbGFzc1tdIHN1YkNsYXNzZXNPZihFQ2xhc3MgZUMpIHsKKwkJQ29sbGVjdGlvbjxFT2JqZWN0PiBzdWJDbGFzc2VzID0gZmluZE9wcG9zaXRlcyhlQywKKwkJCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc19FU3VwZXJUeXBlcygpKTsKKwkJRUNsYXNzW10gcmVzID0gbmV3IEVDbGFzc1tzdWJDbGFzc2VzLnNpemUoKV07CisJCWludCBpID0gMDsKKwkJZm9yIChFT2JqZWN0IHNjIDogc3ViQ2xhc3NlcykgeworCQkJaWYgKHNjIGluc3RhbmNlb2YgRUNsYXNzKSB7CisJCQkJcmVzW2ldID0gKEVDbGFzcykgc2M7CisJCQkJaSsrOworCQkJfQorCQl9CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgeworCQlFQ2xhc3MgZUMgPSAoRUNsYXNzKSBwYXJlbnQ7CisJCWJvb2xlYW4gcmVzOyAKKwkJaWYgKF90eXBlc1ZpZXcuaXNTaG93aW5TdXBlclR5cGVIaWVyYXJjaHkoKSkgeworCQkJcmVzID0gc3VwZXJUeXBlc09mKGVDKS5sZW5ndGggIT0gMDsKKwkJfSBlbHNlIHsKKwkJCXJlcyA9IHN1YkNsYXNzZXNPZihlQykubGVuZ3RoICE9IDA7CisJCX0KKwkJcmV0dXJuIHJlczsKKwl9CisKKwlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RU9iamVjdD4gZmluZE9wcG9zaXRlcyhmaW5hbCBFT2JqZWN0IG9iamVjdCwKKwkJCWZpbmFsIEVSZWZlcmVuY2Ugb3V0Z29pbmdFUmVmZXJlbmNlKSB7CisJCS8vIHNlZSBTZWMuIDEzLjUuMyBVc2luZyBDcm9zcyBSZWZlcmVuY2VycyBvbiBFTUYgYm9vayAoMXN0IEVkLikKKwkJQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZz4gc2V0dGluZ3MgPSBuZXcgRWNvcmVVdGlsLlVzYWdlQ3Jvc3NSZWZlcmVuY2VyKAorCQkJCW9iamVjdC5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKSB7CisKKwkJCXByb3RlY3RlZCBib29sZWFuIGNyb3NzUmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwKKwkJCQkJRVJlZmVyZW5jZSBlUmVmZXJlbmNlLCBFT2JqZWN0IGNyb3NzUmVmZXJlbmNlZE9iamVjdCkgeworCQkJCXJldHVybiBvYmplY3QgPT0gY3Jvc3NSZWZlcmVuY2VkT2JqZWN0CisJCQkJCQkmJiBlUmVmZXJlbmNlID09IG91dGdvaW5nRVJlZmVyZW5jZTsKKwkJCX0KKworCQkJcHVibGljIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmc+IGZpbmRVc2FnZSgKKwkJCQkJRU9iamVjdCBlT2JqZWN0KSB7CisJCQkJcmV0dXJuIHN1cGVyLmZpbmRVc2FnZShlT2JqZWN0KTsKKwkJCX0KKworCQl9LmZpbmRVc2FnZShvYmplY3QpOworCisJCUxpc3Q8RU9iamVjdD4gcmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8RU9iamVjdD4oKTsKKworCQlmb3IgKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nIHNldHRpbmcgOiBzZXR0aW5ncykgeworCQkJaWYgKHNldHRpbmcuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkgPT0gb3V0Z29pbmdFUmVmZXJlbmNlKSB7CisJCQkJcmVmZXJlbmNlcy5hZGQoc2V0dGluZy5nZXRFT2JqZWN0KCkpOworCQkJfQorCQl9CisJCXJldHVybiByZWZlcmVuY2VzOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3ZpZXdzL1R5cGVzVmlld0RvdWJsZUNsaWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS92aWV3cy9UeXBlc1ZpZXdEb3VibGVDbGljay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOWQzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS92aWV3cy9UeXBlc1ZpZXdEb3VibGVDbGljay5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgTWlndWVsIEdhcmNpYSAoVGVjaCBVbml2IEhhbWJ1cmctSGFyYnVyZykgLSBjdXN0b21pemF0aW9uIGZvciBFTUYgR2VuZXJpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpLnZpZXdzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy5jb3JlLmxhbmcuZ2VuLmFzdC5FbWZhdGljQVNUTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5lZGl0b3IuRW1mYXRpY0VkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS5oeXBlcmxpbmtzLkVtZmF0aWNIeXBlcmxpbmtEZXRlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKKworcHVibGljIGNsYXNzIFR5cGVzVmlld0RvdWJsZUNsaWNrIGV4dGVuZHMgQWN0aW9uIHsKKworCXByaXZhdGUgVHlwZXNWaWV3IF90djsKKwlwcml2YXRlIFRyZWVWaWV3ZXIgX3R5cGVzVmlld2VyOworCisJcHVibGljIFR5cGVzVmlld0RvdWJsZUNsaWNrKFR5cGVzVmlldyB0diwgVHJlZVZpZXdlciB0eXBlc1ZpZXdlcikgeworCQlfdHYgPSB0djsKKwkJX3R5cGVzVmlld2VyID0gdHlwZXNWaWV3ZXI7CisJfQorCisJcHVibGljIHZvaWQgcnVuKCkgeworCQkvKgorCQkgKiBUT0RPIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGRvY3VtZW50IHdoZXJlIHRoZSBjbGlja2VkIHR5cGUgaXMgYmVpbmcKKwkJICogZWRpdGVkCisJCSAqLworCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IF90eXBlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCWlmIChvYmogaW5zdGFuY2VvZiBFQ2xhc3MpIHsKKwkJCS8vIFRPRE8gZmluZCB0aGUgcmlnaHQgb25lISAKKwkJCUVtZmF0aWNFZGl0b3IgZWRpdG9yID0gX3R2LmdldEFjdGl2ZUVtZmF0aWNFZGl0b3IoKTsKKwkJCWlmIChlZGl0b3IgIT0gbnVsbCkgeworCQkJCUVtZmF0aWNBU1ROb2RlIGxhbmRpbmdQbGFjZSA9IEVtZmF0aWNIeXBlcmxpbmtEZXRlY3RvcgorCQkJCQkJLmdldExhbmRpbmdQbGFjZSgoRUNsYXNzKSBvYmosIGVkaXRvcik7CisJCQkJaWYgKGxhbmRpbmdQbGFjZSAhPSBudWxsKSB7CisJCQkJCWVkaXRvci5zZXRTZWxlY3Rpb24obGFuZGluZ1BsYWNlLCB0cnVlKTsKKwkJCQkJZWRpdG9yLnNldEZvY3VzKCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvdmlld3MvVHlwZXNWaWV3TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvdmlld3MvVHlwZXNWaWV3TGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYmM3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS92aWV3cy9UeXBlc1ZpZXdMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkudmlld3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLmNvcmUuZ2VuZXJpY3MudXRpbC5HZW5lcmljc1V0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkuRW1mYXRpY1VJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworCitjbGFzcyBUeXBlc1ZpZXdMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7CisKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgeworCQlFQ2xhc3MgZUMgPSAoRUNsYXNzKSBvYmo7CisJCVN0cmluZyByZXMgPSBHZW5lcmljc1V0aWwuZ2V0VGV4dChHZW5lcmljc1V0aWwuZ2V0RUdlbmVyaWNUeXBlKGVDKSk7CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKKwkJU3RyaW5nIGltZ05hbWUgPSAiIjsKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIEVDbGFzcykgeworCQkJRUNsYXNzIGVDID0gKEVDbGFzcykgb2JqOworCQkJaW1nTmFtZSArPSBlQy5pc0ludGVyZmFjZSgpID8gImludF8iIDogImNsYXNzXyI7CisJCQlpbWdOYW1lICs9IGVDLmlzQWJzdHJhY3QoKSA/ICJhYnMiIDogIm9iaiI7CisJCX0KKwkJaWYgKCFpbWdOYW1lLmVxdWFscygiIikpIHsKKwkJCXJldHVybiBFbWZhdGljVUlQbHVnaW4uZ2V0SW1hZ2UoInR5cGVzVmlldy8iICsgaW1nTmFtZSk7CisJCX0KKwkJU3RyaW5nIGltYWdlS2V5ID0gSVNoYXJlZEltYWdlcy5JTUdfT0JKX0VMRU1FTlQ7CisJCWltYWdlS2V5ID0gSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUjsKKwkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoaW1hZ2VLZXkpOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3dpemFyZHMvRW1mYXRpY05ld0ZpbGVDcmVhdGlvblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3dpemFyZHMvRW1mYXRpY05ld0ZpbGVDcmVhdGlvblBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODc2YTY0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS9zcmMvb3JnL2VjbGlwc2UvZW1mL2VtZmF0aWMvdWkvd2l6YXJkcy9FbWZhdGljTmV3RmlsZUNyZWF0aW9uUGFnZS5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE1pZ3VlbCBHYXJjaWEgKFRlY2ggVW5pdiBIYW1idXJnLUhhcmJ1cmcpIC0gY3VzdG9taXphdGlvbiBmb3IgRU1GIEdlbmVyaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS53aXphcmRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nOworCisvKioKKyAqIFRoZSAiTmV3IiB3aXphcmQgcGFnZSBhbGxvd3Mgc2V0dGluZyB0aGUgY29udGFpbmVyIGZvciB0aGUgbmV3IGZpbGUgYXMgd2VsbAorICogYXMgdGhlIGZpbGUgbmFtZS4gVGhlIHBhZ2Ugd2lsbCBvbmx5IGFjY2VwdCBmaWxlIG5hbWUgd2l0aG91dCB0aGUgZXh0ZW5zaW9uCisgKiBPUiB3aXRoIHRoZSBleHRlbnNpb24gdGhhdCBtYXRjaGVzIHRoZSBleHBlY3RlZCBvbmUgKGVtZikuCisgKi8KKworcHVibGljIGNsYXNzIEVtZmF0aWNOZXdGaWxlQ3JlYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CisJcHJpdmF0ZSBUZXh0IGNvbnRhaW5lclRleHQ7CisKKwlwcml2YXRlIFRleHQgZmlsZVRleHQ7CisKKwlwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOworCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIFNhbXBsZU5ld1dpemFyZFBhZ2UuCisJICogCisJICogQHBhcmFtIHBhZ2VOYW1lCisJICovCisJcHVibGljIEVtZmF0aWNOZXdGaWxlQ3JlYXRpb25QYWdlKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCXN1cGVyKCJ3aXphcmRQYWdlIik7CisJCXNldFRpdGxlKCJFbWZhdGljIEZpbGUiKTsKKwkJc2V0RGVzY3JpcHRpb24oIlRoaXMgd2l6YXJkIGNyZWF0ZXMgYSBuZXcgZmlsZSB3aXRoICouZW1mIGV4dGVuc2lvbiB0aGF0IGNhbiBiZSBvcGVuZWQgYnkgdGhlIEVtZmF0aWMgZWRpdG9yLiIpOworCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMzsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDk7CisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOworCQlsYWJlbC5zZXRUZXh0KCImQ29udGFpbmVyOiIpOworCisJCWNvbnRhaW5lclRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJY29udGFpbmVyVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKKwkJY29udGFpbmVyVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQlkaWFsb2dDaGFuZ2VkKCk7CisJCQl9CisJCX0pOworCisJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULlBVU0gpOworCQlidXR0b24uc2V0VGV4dCgiQnJvd3NlLi4uIik7CisJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQloYW5kbGVCcm93c2UoKTsKKwkJCX0KKwkJfSk7CisJCWxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOworCQlsYWJlbC5zZXRUZXh0KCImRmlsZSBuYW1lOiIpOworCisJCWZpbGVUZXh0ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7CisJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWZpbGVUZXh0LnNldExheW91dERhdGEoZ2QpOworCQlmaWxlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQlkaWFsb2dDaGFuZ2VkKCk7CisJCQl9CisJCX0pOworCQlpbml0aWFsaXplKCk7CisJCWRpYWxvZ0NoYW5nZWQoKTsKKwkJc2V0Q29udHJvbChjb250YWluZXIpOworCX0KKworCS8qKgorCSAqIFRlc3RzIGlmIHRoZSBjdXJyZW50IHdvcmtiZW5jaCBzZWxlY3Rpb24gaXMgYSBzdWl0YWJsZSBjb250YWluZXIgdG8gdXNlLgorCSAqLworCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7CisJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uaXNFbXB0eSgpID09IGZhbHNlCisJCQkJJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKwkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKKwkJCWlmIChzc2VsLnNpemUoKSA+IDEpCisJCQkJcmV0dXJuOworCQkJT2JqZWN0IG9iaiA9IHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQlpZiAob2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSB7CisJCQkJSUNvbnRhaW5lciBjb250YWluZXI7CisJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb250YWluZXIpCisJCQkJCWNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBvYmo7CisJCQkJZWxzZQorCQkJCQljb250YWluZXIgPSAoKElSZXNvdXJjZSkgb2JqKS5nZXRQYXJlbnQoKTsKKwkJCQljb250YWluZXJUZXh0LnNldFRleHQoY29udGFpbmVyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7CisJCQl9CisJCX0KKwkJZmlsZVRleHQuc2V0VGV4dCgibmV3X2ZpbGUuZW1mIik7CisJfQorCisJLyoqCisJICogVXNlcyB0aGUgc3RhbmRhcmQgY29udGFpbmVyIHNlbGVjdGlvbiBkaWFsb2cgdG8gY2hvb3NlIHRoZSBuZXcgdmFsdWUgZm9yCisJICogdGhlIGNvbnRhaW5lciBmaWVsZC4KKwkgKi8KKworCXByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2UoKSB7CisJCUNvbnRhaW5lclNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgQ29udGFpbmVyU2VsZWN0aW9uRGlhbG9nKAorCQkJCWdldFNoZWxsKCksIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIGZhbHNlLAorCQkJCSJTZWxlY3QgbmV3IGZpbGUgY29udGFpbmVyIik7CisJCWlmIChkaWFsb2cub3BlbigpID09IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZy5PSykgeworCQkJT2JqZWN0W10gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOworCQkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMSkgeworCQkJCWNvbnRhaW5lclRleHQuc2V0VGV4dCgoKFBhdGgpIHJlc3VsdFswXSkudG9TdHJpbmcoKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBFbnN1cmVzIHRoYXQgYm90aCB0ZXh0IGZpZWxkcyBhcmUgc2V0LgorCSAqLworCisJcHJpdmF0ZSB2b2lkIGRpYWxvZ0NoYW5nZWQoKSB7CisJCUlSZXNvdXJjZSBjb250YWluZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCisJCQkJLmZpbmRNZW1iZXIobmV3IFBhdGgoZ2V0Q29udGFpbmVyTmFtZSgpKSk7CisJCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7CisKKwkJaWYgKGdldENvbnRhaW5lck5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7CisJCQl1cGRhdGVTdGF0dXMoIkZpbGUgY29udGFpbmVyIG11c3QgYmUgc3BlY2lmaWVkIik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGNvbnRhaW5lciA9PSBudWxsCisJCQkJfHwgKGNvbnRhaW5lci5nZXRUeXBlKCkgJiAoSVJlc291cmNlLlBST0pFQ1QgfCBJUmVzb3VyY2UuRk9MREVSKSkgPT0gMCkgeworCQkJdXBkYXRlU3RhdHVzKCJGaWxlIGNvbnRhaW5lciBtdXN0IGV4aXN0Iik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFjb250YWluZXIuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCXVwZGF0ZVN0YXR1cygiUHJvamVjdCBtdXN0IGJlIHdyaXRhYmxlIik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGZpbGVOYW1lLmxlbmd0aCgpID09IDApIHsKKwkJCXVwZGF0ZVN0YXR1cygiRmlsZSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGZpbGVOYW1lLnJlcGxhY2UoJ1xcJywgJy8nKS5pbmRleE9mKCcvJywgMSkgPiAwKSB7CisJCQl1cGRhdGVTdGF0dXMoIkZpbGUgbmFtZSBtdXN0IGJlIHZhbGlkIik7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IGRvdExvYyA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisJCWlmIChkb3RMb2MgIT0gLTEpIHsKKwkJCVN0cmluZyBleHQgPSBmaWxlTmFtZS5zdWJzdHJpbmcoZG90TG9jICsgMSk7CisJCQlpZiAoZXh0LmVxdWFsc0lnbm9yZUNhc2UoImVtZiIpID09IGZhbHNlKSB7CisJCQkJdXBkYXRlU3RhdHVzKCJGaWxlIGV4dGVuc2lvbiBtdXN0IGJlIFwiZW1mXCIiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJdXBkYXRlU3RhdHVzKG51bGwpOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOworCQlzZXRQYWdlQ29tcGxldGUobWVzc2FnZSA9PSBudWxsKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lck5hbWUoKSB7CisJCXJldHVybiBjb250YWluZXJUZXh0LmdldFRleHQoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgeworCQlyZXR1cm4gZmlsZVRleHQuZ2V0VGV4dCgpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS93aXphcmRzL0VtZmF0aWNOZXdXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvc3JjL29yZy9lY2xpcHNlL2VtZi9lbWZhdGljL3VpL3dpemFyZHMvRW1mYXRpY05ld1dpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZmY2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3NyYy9vcmcvZWNsaXBzZS9lbWYvZW1mYXRpYy91aS93aXphcmRzL0VtZmF0aWNOZXdXaXphcmQuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBNaWd1ZWwgR2FyY2lhIChUZWNoIFVuaXYgSGFtYnVyZy1IYXJidXJnKSAtIGN1c3RvbWl6YXRpb24gZm9yIEVNRiBHZW5lcmljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkud2l6YXJkczsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKKworLyoqCisgKiBUaGlzIGlzIGEgc2FtcGxlIG5ldyB3aXphcmQuIEl0cyByb2xlIGlzIHRvIGNyZWF0ZSBhIG5ldyBmaWxlIAorICogcmVzb3VyY2UgaW4gdGhlIHByb3ZpZGVkIGNvbnRhaW5lci4gSWYgdGhlIGNvbnRhaW5lciByZXNvdXJjZQorICogKGEgZm9sZGVyIG9yIGEgcHJvamVjdCkgaXMgc2VsZWN0ZWQgaW4gdGhlIHdvcmtzcGFjZSAKKyAqIHdoZW4gdGhlIHdpemFyZCBpcyBvcGVuZWQsIGl0IHdpbGwgYWNjZXB0IGl0IGFzIHRoZSB0YXJnZXQKKyAqIGNvbnRhaW5lci4gVGhlIHdpemFyZCBjcmVhdGVzIG9uZSBmaWxlIHdpdGggdGhlIGV4dGVuc2lvbgorICogImVtZiIuIElmIGEgc2FtcGxlIGVkaXRvciAoYWxzbyBhdmFpbGFibGUKKyAqIGFzIGEgdGVtcGxhdGUpIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBzYW1lIGV4dGVuc2lvbiwgaXQgd2lsbAorICogYmUgYWJsZSB0byBvcGVuIGl0LgorICovCisKK3B1YmxpYyBjbGFzcyBFbWZhdGljTmV3V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7CisJcHJpdmF0ZSBFbWZhdGljTmV3RmlsZUNyZWF0aW9uUGFnZSBwYWdlOworCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgRW1mYXRpY05ld1dpemFyZC4KKwkgKi8KKwlwdWJsaWMgRW1mYXRpY05ld1dpemFyZCgpIHsKKwkJc3VwZXIoKTsKKwkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7CisJfQorCQorCS8qKgorCSAqIEFkZGluZyB0aGUgcGFnZSB0byB0aGUgd2l6YXJkLgorCSAqLworCisJcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7CisJCXBhZ2UgPSBuZXcgRW1mYXRpY05ld0ZpbGVDcmVhdGlvblBhZ2Uoc2VsZWN0aW9uKTsKKwkJYWRkUGFnZShwYWdlKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiAnRmluaXNoJyBidXR0b24gaXMgcHJlc3NlZCBpbgorCSAqIHRoZSB3aXphcmQuIFdlIHdpbGwgY3JlYXRlIGFuIG9wZXJhdGlvbiBhbmQgcnVuIGl0CisJICogdXNpbmcgd2l6YXJkIGFzIGV4ZWN1dGlvbiBjb250ZXh0LgorCSAqLworCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CisJCWZpbmFsIFN0cmluZyBjb250YWluZXJOYW1lID0gcGFnZS5nZXRDb250YWluZXJOYW1lKCk7CisJCWZpbmFsIFN0cmluZyBmaWxlTmFtZSA9IHBhZ2UuZ2V0RmlsZU5hbWUoKTsKKwkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJCQl0cnkgeworCQkJCQlkb0ZpbmlzaChjb250YWluZXJOYW1lLCBmaWxlTmFtZSwgbW9uaXRvcik7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOworCQkJCX0gZmluYWxseSB7CisJCQkJCW1vbml0b3IuZG9uZSgpOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJdHJ5IHsKKwkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOworCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIkVycm9yIiwgcmVhbEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvKioKKwkgKiBUaGUgd29ya2VyIG1ldGhvZC4gSXQgd2lsbCBmaW5kIHRoZSBjb250YWluZXIsIGNyZWF0ZSB0aGUKKwkgKiBmaWxlIGlmIG1pc3Npbmcgb3IganVzdCByZXBsYWNlIGl0cyBjb250ZW50cywgYW5kIG9wZW4KKwkgKiB0aGUgZWRpdG9yIG9uIHRoZSBuZXdseSBjcmVhdGVkIGZpbGUuCisJICovCisKKwlwcml2YXRlIHZvaWQgZG9GaW5pc2goCisJCVN0cmluZyBjb250YWluZXJOYW1lLAorCQlTdHJpbmcgZmlsZU5hbWUsCisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBjcmVhdGUgYSBzYW1wbGUgZmlsZQorCQltb25pdG9yLmJlZ2luVGFzaygiQ3JlYXRpbmcgIiArIGZpbGVOYW1lLCAyKTsKKwkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJvb3QuZmluZE1lbWJlcihuZXcgUGF0aChjb250YWluZXJOYW1lKSk7CisJCWlmICghcmVzb3VyY2UuZXhpc3RzKCkgfHwgIShyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpKSB7CisJCQl0aHJvd0NvcmVFeGNlcHRpb24oIkNvbnRhaW5lciBcIiIgKyBjb250YWluZXJOYW1lICsgIlwiIGRvZXMgbm90IGV4aXN0LiIpOworCQl9CisJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIHJlc291cmNlOworCQlmaW5hbCBJRmlsZSBmaWxlID0gY29udGFpbmVyLmdldEZpbGUobmV3IFBhdGgoZmlsZU5hbWUpKTsKKwkJdHJ5IHsKKwkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG9wZW5Db250ZW50U3RyZWFtKCk7CisJCQlpZiAoZmlsZS5leGlzdHMoKSkgeworCQkJCWZpbGUuc2V0Q29udGVudHMoc3RyZWFtLCB0cnVlLCB0cnVlLCBtb25pdG9yKTsKKwkJCX0gZWxzZSB7CisJCQkJZmlsZS5jcmVhdGUoc3RyZWFtLCB0cnVlLCBtb25pdG9yKTsKKwkJCX0KKwkJCXN0cmVhbS5jbG9zZSgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCX0KKwkJbW9uaXRvci53b3JrZWQoMSk7CisJCW1vbml0b3Iuc2V0VGFza05hbWUoIk9wZW5pbmcgZmlsZSBmb3IgZWRpdGluZy4uLiIpOworCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPQorCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKKwkJCQl0cnkgeworCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKKwkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJbW9uaXRvci53b3JrZWQoMSk7CisJfQorCQorCS8qKgorCSAqIFdlIHdpbGwgaW5pdGlhbGl6ZSBmaWxlIGNvbnRlbnRzIHdpdGggYSBzYW1wbGUgdGV4dC4KKwkgKi8KKworCXByaXZhdGUgSW5wdXRTdHJlYW0gb3BlbkNvbnRlbnRTdHJlYW0oKSB7CisJCVN0cmluZyBjb250ZW50cyA9CisJCQkiQG5hbWVzcGFjZShcclxuXHR1cmk9XCJodHRwOi8vYS5iLmMveC95L1pcIixcclxuXHRwcmVmaXg9XCJwXCIpXHJcbnBhY2thZ2UgdG9wO1xyXG5cclxuIjsKKwkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50cy5nZXRCeXRlcygpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGhyb3dDb3JlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlTdGF0dXMgc3RhdHVzID0KKwkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIm9yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpIiwgSVN0YXR1cy5PSywgbWVzc2FnZSwgbnVsbCk7CisJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisJfQorCisJLyoqCisJICogV2Ugd2lsbCBhY2NlcHQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIHRvIHNlZSBpZgorCSAqIHdlIGNhbiBpbml0aWFsaXplIGZyb20gaXQuCisJICogQHNlZSBJV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9UaHVtYnMuZGIgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9UaHVtYnMuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkNmFkZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvdHlwZXNWaWV3L1RodW1icy5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9hbHBoYWJfc29ydF9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9hbHBoYWJfc29ydF9jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxMWNjMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvdHlwZXNWaWV3L2FscGhhYl9zb3J0X2NvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9jbGFzc19hYnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS90eXBlc1ZpZXcvY2xhc3NfYWJzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWRiNzVhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS90eXBlc1ZpZXcvY2xhc3NfYWJzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9jbGFzc19hYnN0cmFjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9jbGFzc19hYnN0cmFjdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwM2FlMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvdHlwZXNWaWV3L2NsYXNzX2Fic3RyYWN0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9jbGFzc19vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS90eXBlc1ZpZXcvY2xhc3Nfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGMyYTgzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS90eXBlc1ZpZXcvY2xhc3Nfb2JqLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9kZWZpbmluZ3R5cGVfc29ydF9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9kZWZpbmluZ3R5cGVfc29ydF9jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2ZWFiYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvdHlwZXNWaWV3L2RlZmluaW5ndHlwZV9zb3J0X2NvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9pbmhlcl9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9pbmhlcl9jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyNjAwMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvdHlwZXNWaWV3L2luaGVyX2NvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9pbnRfYWJzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvdHlwZXNWaWV3L2ludF9hYnMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNGY3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9pbnRfYWJzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9pbnRfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvdHlwZXNWaWV3L2ludF9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYmM0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9pbnRfb2JqLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9zdWJfY28uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS90eXBlc1ZpZXcvc3ViX2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDg3MWRmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5lbWYuZW1mYXRpYy51aS90eXBlc1ZpZXcvc3ViX2NvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9zdXBlcl9jby5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmVtZi5lbWZhdGljLnVpL3R5cGVzVmlldy9zdXBlcl9jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhYzExNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuZW1mLmVtZmF0aWMudWkvdHlwZXNWaWV3L3N1cGVyX2NvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCg==